2010-01-29 1 views
1

J'ai une entrée dans un fichier batch qui contient une liste de fichiers (ceci est une ligne et une entrée parmi fichier de chauve-souris):Comment puis-je obtenir une boucle for pour travailler sur une chaîne délimitée par des virgules d'une seule ligne avec des espaces

"\\Server\my directory name\subdir,\\Server\my directory name\subdir2,\\Server\my directory name\subdir3"

Je voudrais parcourir cette liste et d'effectuer une commande sur chaque répertoire dans la liste. Cependant, lorsque je spécifie delims =, il traite les espaces comme des délimiteurs, même si les docs disent "Spécifie un ensemble de délimiteurs, ce qui remplace l'ensemble de délimiteurs par défaut d'espace et de tabulation". Ne semble pas remplacer, semble juste ajouter à. J'ai essayé de jouer avec backq mais cela ne semble pas fonctionner, puisque l'entrée est déjà citée.

Le plus proche que je peux obtenir est

for /f "tokens=1-8 delims=," %%d in ("%destPath%") do (
echo %%d 
echo %%e 
echo . 
    ) 

Mais j'ai un ensemble uknown d'entrées ici, donc je pourrais être obtenir 12 répertoires à venir et ne veulent pas avoir une ligne répétée pour l'exécution de la commande (Même ligne n fois dans le corps de la boucle), semble vaincre le but d'une boucle for.

connexes: How do I get a for loop to work with a comma delimited string?

+0

Il a été peut-être 3 ans que je créé une boucle DOS comme celle-ci. Mais si ma mémoire me sert correctement, les chaînes de lot Dos ne peuvent pas contenir d'espaces. Il rechigne quand ils le font, et fondamentalement fait ce que vous vous plaignez. Cela fait un moment cependant. – jsmith

+0

Eh bien, je pense que l'usebackq s'en occupera, mais bon sang si je peux le faire fonctionner. Je devrais juste abandonner ceci et écrire une application de console en C#. – jcollum

+0

Cela étant dit, cela fonctionne * presque * en ce moment ... – jcollum

Répondre

2

En utilisant la virgule comme séparateur n'est pas une bonne idée si vous ne contrôlez pas l'entrée car il est également valable dans les noms de fichiers. Si vous pouviez utiliser * ou quelque chose comme ça, vous pourriez être sûr que vous êtes capable de gérer tous les chemins valides.

Je décidé de ne pas combattre la commande FOR trop, au lieu que j'opté pour une « fonction sous » récursif

:printThem 
for /F "tokens=1,* delims=," %%A in ("%~1") DO (
    echo.Path: %%A 
    call :printThem "%%~B" 
) 
@goto :EOF 

call :printThem "\\Server\my directory name\subdir,\\Server\my directory name\subdir2,\\Server\my directory name\subdir3" 
+0

Merci, c'est assez lisse. – jcollum

0

en plus DOS (cmd.exe), l'autre meilleure alternative, (sans téléchargement), utilise vbscript. voici un exemple

Set objFS = CreateObject("Scripting.FileSystemObject") 
Set objArgs = WScript.Arguments 
strFile = objArgs(0) 
Set objFile = objFS.OpenTextFile(strFile) 
Do Until objFile.AtEndOfStream 
    strLine = objFile.ReadLine 
    s = Split(strLine,",") 
    For Each strDir In s 
     WScript.Echo strDir 
    'Set objFolder = objFS.GetFolder(strDir) 
    'WScript.Echo strDir & " modified date is " & objFolder.DateLastModified 
    'Set objFolder = Nothing 
    Next 
Loop 

Enregistrer sous myscript.vbs et sur la ligne de commande

C:\test>cscript //nologo myscript.vbs file 
\\Server\my directory name\subdir 
\\Server\my directory name\subdir2 
\\Server\my directory name\subdir3 

vous pouvez améliorer le script pour faire ce que vous voulez à l'intérieur de ces répertoires, ou utiliser le lot pour saisir ces répertoires. par exemple

@echo off 

for /F "delims=" %%f in ('cscript //nologo test.vbs file') do (
echo do something with %%f 
) 
Questions connexes