如何在目录中移动最新文件,然后处理脚本的其余部分

时间:2016-12-30 21:55:17

标签: batch-file

所以我试图从一个包含2000个文件的目录中一次取出一个文件,并将其移动到另一个目录,由我的其余脚本处理。脚本如下。现在我知道gswin64线路是单独工作的时候我指定它是一个文件名但不是我确定变量。但是当我运行它时,它会将目录输入中的所有文件复制到目录中,然后运行其余的脚本。如何让它一次执行一个,然后在复制其余文件之前处理脚本?

1 个答案:

答案 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不是内置命令。