for / d迭代文件夹,如果有一个名字,则无效

时间:2015-07-07 12:53:55

标签: windows batch-file cmd

我在Setup文件夹中有大量这样的文件夹:

PN 1001-1.22 abe
PN 1001-1.12 dfe
PN 1001-1.33 fgh -
PN 1001-1.01 ijk
PN 1001-1.37 lmn
PN 1001-1.02 opq

这些文件夹中的每一个都有一个名为install的子文件夹,其中包含可执行文件。

我想将可执行文件复制到。\ Setup文件夹。所以我使用这样的脚本:

for /d %%G in (Setup\*) do (
   xcopy "%%G\Installation\*.exe" .\Setup
)

但是对于PN 1001-1.33 fgh文件夹,脚本工作正常。必须是 - 结束。我收到错误:

File not found - *.exe

我该如何解决这个问题?如果这只是方法的话,我甚至可以剥离 -

我在Windows 7上运行。

2 个答案:

答案 0 :(得分:2)

-结尾的文件或文件夹名称应该不是问题。我怀疑你在坏文件夹名称中有一个尾随空格。

Windows通常不允许以空格或句点结尾的文件或文件夹名称,但有一些不明确的方法可以创建它们。一旦创建,它们就会造成严重破坏,因为许多命令无法使用这些通常非法的名称。

要证明理论,请在Setup文件夹中执行以下命令:

for /d %F in ("PN 1001-1.33 fgh -*") do @echo "%F"

我相信您会看到如下结果:"PN 1001-1.33 fgh - "。请注意尾随空格。

某些命令可以通过在\\?\的完整路径前添加前缀来处理这些问题名称。不幸的是,RENAME不是其中之一,MOVE也不允许你重命名文件夹。

我建议您将问题文件夹中的所有文件和文件夹移到正确命名的文件夹中,然后删除有问题的文件夹。但是XCOPY和ROBOCOPY无法与\\?\一起使用,因此移动子文件夹有点棘手。

以下脚本应该有所帮助,但您必须修复“root”,“old”和“new”变量以匹配您的特定根路径和问题文件夹名称:

setlocal

set "root=c:\full\path\to\your\Setup"
set "old=%root%\PN 1001-1.33 fgh - "
set "new=%root%\PN 1001-1.33 fgh"

md "%new%"
move "\\?\%old%\*" "%new%"
for /d %%F in ("\\?\%old%\*") do move "%%F" "%new%"
rd "\\?\%old%"

运行后,应该有效地重命名问题文件夹,删除“ - ”后缀。

可以在https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx

找到定义文件和文件夹名称规则的Microsoft文章

答案 1 :(得分:0)

试试这个:

for /f "tokens=*" %%g in ('dir /b /ad Setup\*') do (
    for /f "tokens=*" %%h in ('dir /b "Setup\%%g\Installation\*.exe"') do (
        copy /y /b "Setup\%%g\Installation\%%h" Setup
    )
)

注意(edit1):第一个版本没有考虑文件夹名称中的空格。