как получить цикл for для работы с одной строкой через запятую с пробелами - PullRequest
1 голос
/ 29 января 2010

У меня есть входные данные для пакетного файла, который содержит список файлов (это все одна строка и один из многих входных данных для файла bat):

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

Я бы хотел повторить этот список и выполнить команду для каждого каталога в списке. Однако, когда я указываю delims =, он обрабатывает пробелы как разделители, даже если в документах написано: «Указывает набор разделителей. Он заменяет стандартный набор разделителей пробела и табуляции». Кажется, не заменяет, а только добавляет. Я попытался возиться с backq, но это, похоже, не работает, так как ввод уже указан.

Самое близкое, что я могу получить -

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

Но у меня здесь есть неизвестный набор входных данных, так что я мог бы получать 12 каталогов и не хотел бы иметь повторяющуюся строку для выполнения команды (одну и ту же строку n раз в теле цикла), кажется, это поражение цель цикла.

Связанный: Как получить цикл for для работы со строкой, разделенной запятой?

Ответы [ 2 ]

2 голосов
/ 30 января 2010

Использование запятой в качестве разделителя не является хорошей идеей, если вы не управляете вводом, поскольку оно также допустимо в именах файлов. Если бы вы могли использовать * или что-то в этом роде, вы могли бы быть уверены, что сможете обрабатывать все допустимые пути.

Я решил не слишком драться с командой FOR, вместо этого я выбрал рекурсивную «подфункцию»

: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 голосов
/ 30 января 2010

кроме DOS (cmd.exe), другая лучшая альтернатива (без какой-либо загрузки) использует vbscript. вот пример

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

сохранить как myscript.vbs и в командной строке

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

Вы можете усовершенствовать скрипт, чтобы он делал то, что вы хотите внутри этих каталогов, или использовать пакет для захвата этих каталогов. например,

@echo off

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