2 votes

FOR imbriqué avec des variables

J'essaie d'écrire un script batch script qui va parcourir une liste d'ordinateurs, lire un fichier sur l'ordinateur, délimiter le nom du fichier, puis faire écho au nom de l'ordinateur et au résultat du nom du fichier. Le problème que j'ai est d'obtenir que la variable du nom de l'ordinateur se remplisse dans la commande imbriquée FOR /R. Voici mon script :

@ECHO OFF
SetLocal EnableDelayedExpansion
SET LIST=Computers.txt
FOR /F %%A IN (%LIST%) DO (
    FOR /R \\%%A\c$\folder1\folder2 %%B IN (*.txt) DO (
        FOR /F "tokens=2 delims=." %%C IN ("%%B") DO (ECHO %%A %%C
        )
    )
)
EndLocal

Le nom du fichier est quelque chose comme RB-C1SRC20160716CL.P17.txt. Le résultat que je recherche est donc

MyPCName P17

Mais j'obtiens un résultat vide. Ce que j'ai découvert, c'est que le %%A var est alimenté par le fichier texte, mais que le %%A var dans le FOR /R ne l'est pas. Si j'effectue un ECHO sur les commandes FOR, je vois FOR /R \%a \folder1\folder2 au lieu de FOR /R \MyPCName\folder1\folder2. Cette panne empêche le reste du script de fonctionner correctement.

UPDATE :

Merci à aschipfl de m'avoir orienté dans la bonne direction. J'ai finalement réussi à faire fonctionner le script. Voici la version qui fonctionne :

@ECHO OFF
SetLocal EnableDelayedExpansion
SET LIST=Computers.txt
FOR /F %%A IN (%LIST%) DO (
    SET WKSTN=%%A
    CALL :SUB
)
EndLocal
GOTO :EOF

:SUB
FOR /R \\%WKSTN%\c$\folder1\folder2 %%B IN (*.txt) DO (
        FOR /F "tokens=2 delims=." %%C IN ("%%B") DO (ECHO %%A %%C
    )
)

1 votes

4voto

aschipfl Points 17476

Le répertoire racine d'un for /R ne peut pas être donné par un autre for (comme %%I ) ni une variable utilisant l'expansion retardée ( !VAR! ), malheureusement. Vous devez le spécifier soit de manière itérative, par une variable normalement étendue ( %VAR% ) ou par une référence à un argument ( %1 , %2 ,...).

Une bonne solution de contournement consiste à placer l'option for /R dans une sous-routine et utiliser call pour l'appeler depuis votre routine principale. La (variable contenant le) chemin de la racine doit être passée en tant qu'argument à la fonction call . Dans la sous-routine, elle est désignée par une référence d'argument (comme %1 ).

Jetez un coup d'œil à cette réponse de l'article " Obtenir la taille des sous-dossiers uniquement à l'aide d'une commande batch " pour voir comment cela peut être accompli.

Une autre option consiste à passer temporairement dans le répertoire racine avant que l'opération ne soit lancée. for /R qui prend alors par défaut le répertoire de travail actuel. Utilisez pushd"\\%%A\c$\folder1\folder2" pour passer au répertoire cible, puis mettez popd derrière le for /R pour revenir à l'ancien répertoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X