所以我试图从一个包含2000个文件的目录中一次取出一个文件,并将其移动到另一个目录,由我的其余脚本处理。脚本如下。现在我知道gswin64线路是单独工作的时候我指定它是一个文件名但不是我确定变量。但是当我运行它时,它会将目录输入中的所有文件复制到目录中,然后运行其余的脚本。如何让它一次执行一个,然后在复制其余文件之前处理脚本?
答案 0 :(得分:0)
for /F "delims=" %%I in ('dir "H:\documents\gs\input\*.*" /A-d /B /O:-D') do (move "H:\documents\gs\input\%%I" "H:\documents\gs\working"&goto filemoved)
:filemoved
您的原始代码会尝试执行move "H:\documents\gs\input\*.*" "H:\documents\gs\working"
,这就是移动所有文件的原因。您需要做的是使用开关参数执行目录列表命令并将其提供给for /f
。这种dir
形式仅显示名称。所以你需要在move
命令中包含源目录名。您还需要使用"delims="
选项以确保正确处理包含分隔符的文件名,并/a-d
目录切换以确保不包含目录名称。由于您按反向日期顺序排序,因此将首先选择最新文件。移动第一个文件后,您需要中止for
循环,否则它将继续处理整个列表,传输每个文件。这里简单的方法是在下一行简单地goto
标签。
您还使用了*.*
文件掩码,它将处理所有文件,无论扩展名如何。由于您似乎只想处理.pdf
个文件,因此您应该更改该文件掩码以适应。
for /F "delims=" %%x in ('dir H:\documents\gs\working\*.pdf /b') do set "FileName=%%x"
同样,如果您使用dir
,则需要执行for /f
命令。没有明显的理由说明你为什么不能使用更简单的
for %%x in (H:\documents\gs\working\*.pdf) do set "FileName=%%x"
在任何一种情况下,您可能只需要文件的name
部分,因此FileName
应设置为%%~nx
,而不是%%x
。
"C:\program files\gs\gs9.20\bin\gswin64" -o H:\documents\gs\output\"%FileName%" -sDevice=pdfwrite -dFitPage -dFIXEDMEDIA H:\documents\gs\working\"%FileName%"
不平衡报价 - 可执行文件的完整路径名需要引用,因为它包含一个分隔符。可能需要删除\
之后的杂散空格。
引用整个文件名会更好imho,包括驱动器和路径而不是文件名。
del /q H:\documents\gs\working\*.*
rm
不是批处理命令。请注意,此命令将删除H:\documents\gs\working
中的所有文件 - 而不仅仅是您似乎正在处理的.pdf
个文件。
goto start
这个空间是必需的。 gotostart
不是内置命令。