web-dev-qa-db-fra.com

Supprimer des espaces d'une variable en batch

J'écris un fichier pour supprimer les espaces des noms de fichiers dans un dossier, puis mettre le résultat dans un fichier .txt. Je viens d'obtenir un résultat de "Echo est sur." encore et encore. 

C'est ce que j'ai jusqu'ici:

@echo ON
SET LOCAL EnableDelayedExpansion
For %%# in (*.*) do (
    SET var=%%~n#
    Set MyVar=%var%
    set MyVar=%MyVar: =%
    echo %MyVar%>>text.txt
)

Quelqu'un peut-il me dire ce qui ne va pas?

9
user2313522

Si vous obtenez ECHO is on., c’est parce que l’expansion différée n’a pas été utilisée, ce qui a entraîné l’insertion de la valeur de %var% et de %MyVar% avant l’exécution de la commande for. le echo %MyVar%>>text.txt a été exécuté, il a été interprété comme echo >>text.txt. Lorsque echo est exécuté sans aucun argument, il indique si echo est activé ou non, ce que vous obtenez dans text.txt.

Pour résoudre le problème, vous devez faire deux choses:

Premièrement, il y a quelque chose qui ne va pas avec votre deuxième ligne. Il n'y a pas d'espace entre set et local dans setlocal. La deuxième ligne devrait être SETLOCAL EnableDelayedExpansion.

Deuxièmement, pour utiliser l’extension différée, vous devez remplacer tous les %s de chaque variable par !, comme !var! au lieu de %var%.

Résultat final:

@echo ON
SETLOCAL EnableDelayedExpansion
For %%# in (*.*) do (
    SET var=%%~n#
    Set MyVar=!var!
    set MyVar=!MyVar: =!
    echo !MyVar!>>text.txt
)

En réalité, vous n'avez pas besoin d'utiliser une variable temporaire dans ce cas, vous pouvez simplement faire SET MyVar=%%~n# et passer à set MyVar=!MyVar: =!.

8
user2033427

Il est possible de supprimer tous les espaces (pas seulement les espaces de début et de fin) sans utiliser setlocal enabledelayedexpansion avec la ligne suivante:

set var=%var: =%

Cela fonctionne en remplaçant tous les espaces de la chaîne par la chaîne vide.

Source: DOS - Manipulation de chaînes

30
zr870

La mauvaise chose est que vous avez activé le développement de variable (vous l'avez mal écrit ...) et que vous ne l'utilisez pas, lorsque vous utilisez enabledelayedexpansion, vous devez écrire les noms de variable comme ceci:! Variable! au lieu de cela:% Variable%

Mais vous n'avez pas besoin de l'utiliser avec ce code:

@echo ON
For %%# in (*) do (
    SET "var=%%~n#"
    Call Set "MyVar=%%var: =%%"
    Call echo %%MyVar%%>>text.txt
)
1
ElektroStudios

Exécuter le lot suivant dans le dossier contenant les fichiers à renommer

    @echo off
    setlocal enabledelayedexpansion
    for %%j in (*.*) do (
    set filename=%%~nj
    set filename=!filename=.=_!
    set filename=!filename= =_!
    if not "!filename!"=="%%~nj" ren "%%j" "!filename!%%~xj"
    )

vous avez juste besoin d'ajouter l'impression au format txt

0
nfrignani