如何使用for循环来处理带有空格的单行逗号分隔字符串

时间:2010-01-29 20:22:40

标签: batch-file dos

我有一个批处理文件的输入,其中包含一个文件列表(这是一行和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循环的目的。

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

2 个答案:

答案 0 :(得分:2)

如果您不控制输入,则使用逗号作为分隔符不是一个好主意,因为它在文件名中也有效。如果您可以使用*或类似的东西,您可以确定您能够处理所有有效路径。

我决定不要过多地对抗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"

答案 1 :(得分:0)

除了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
)