脚本副本多于* .pdf

时间:2014-03-05 15:12:23

标签: pdf batch-file copy

我有一个复制多个PDF文件的脚本,并将其放在相应的文件夹中。

脚本:

pushd "\\share\folder\"
for %%p in (*.pdf) do for /f "tokens=1 delims=_" %%n in ("%%~np") do (
    copy "%%~fp" "\\share2\folder\%%~n\%%~nxp"
)

但它也复制了这样命名的文件:Test.pdf2098或hello.pdf20j93f2

我只是希望它复制* .pdf文件而不是无效的PDF文件。

2 个答案:

答案 0 :(得分:1)

添加if检查以验证扩展程序

pushd "\\share\folder\"
for %%p in (*.pdf) do if /i ".pdf"=="%%~xp" for /f "tokens=1 delims=_" %%n in ("%%~np") do (
    copy "%%~fp" "\\share2\folder\%%~n\%%~nxp"
)

答案 1 :(得分:1)

David Ruhmann提供了一种解决方法,但没有解释您的代码失败的原因。

问题是NTFS卷上不符合旧的8.3短文件命名标准的文件会自动分配符合标准的备用短文件名。像xxx.pdf2098这样的文件将被赋予一个扩展名为.pdf的短名称。

搜索文件名的窗口命令如COPY,MOVE,FOR等都试图匹配长名称和短名称,从而导致您的问题。

可以(并且经常建议)禁用NTSF卷上的短文件名生成,但任何现有的短名称都将保留,并可能仍会导致问题。

所以David Ruhmann建议您验证每个文件的文件扩展名是正确的。

验证扩展的另一种常用方法是将DIR / B传递给FINDSTR:

for /f "eol=: delims=" %%p in (
  'dir /a-d /b *.pdf^|findstr /lie ".pdf"'
) do for /f "tokens=1 delims=_" %%n in ("%%~np") do (
  copy "%%~fp" "\\share2\folder\%%~n\%%~nxp"
)