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