为什么批处理文件为"发送到"获取路径中空格的文件夹的所有文件名不起作用?

时间:2016-01-08 15:47:50

标签: batch-file cmd filenames

我需要获取文件夹中所有文件的名称才能在Excel中进行比较。我有这个工作,并设置为发送到功能。但是,如果我右键单击的文件夹包含空格,则会失败。这就是我所拥有的:

@echo off
for /f "tokens=2 delims=:." %%x in ('chcp') do set cp=%%x
chcp 1252>nul
set dirpath=%1
dir %dirpath% dir /b /a | sort > "%dirpath%\FolderContents.txt"
chcp %cp%>nul
exit

如果文件夹路径包含1个或多个空格,为什么文件名不会写入"Selected Folder\FolderContents.txt"

1 个答案:

答案 0 :(得分:1)

这几行批处理代码中存在一些错误。

命令 DIR 的行包含命令两次。

作为在命令提示符窗口中运行cmd /?的几个页面后的最后一个段落输出说明,如果名称或路径中有文件/文件夹名称(和其他参数字符串)必须用双引号括起来空间或以下字符之一:&()[]{}^=;!'+,`~

因此,如果文件夹名称包含空格,则执行时批处理文件的第一个参数将用引号括起来。 set dirpath=%1将文件夹名称和引号分配给环境变量dirpath。这导致""C:\Folder With Space"\FolderContents.txt"中的下一行,而您无法按照预期处理命令处理器。

重定向操作符>留下的数字很容易导致将其解释为句柄号。虽然代码页编号足够大,不能解释为句柄编号,但最好在代码中留下一个空格,以便持续重定向操作符>,因为%cp%被代码页编号替换。 / p>

您的任务的真正有用和简化的代码是:

@echo off
for /F "tokens=2 delims=:." %%x in ('chcp') do set "cp=%%x"
chcp 1252 >nul
dir "%~f1" /A-D /B /ON >"%~f1\FolderContents.txt"
chcp %cp% >nul
exit

命令 DIR 只输出

  • 由于选项/A-D
  • 而导致的文件名称
  • 由于选项/B
  • 而采用裸格式 由于选项/ON
  • 按名称排序
  • 且没有路径,因为没有使用选项/S来获取包含所有子目录的列表。

%~f1被命令处理器替换为完整路径不带引号的文件夹名称。

好吧,确定这个的活动代码页并且只有这个命令进程并在退出整个命令进程之前恢复代码页在我的观点中也不是真的需要,因此第二个也是最后一行但也没有必要。< / p>

上述变体将带有路径的文件名写入文本文件。

@echo off
chcp 1252 >nul
del "%~f1\FolderContents.txt" 2>nul
for /F "delims=" %%I in ('dir "%~f1" /A-D /B /ON 2^>nul') do (
    >>"%~f1\FolderContents.txt" echo %~f1\%%I
)
exit

重定向运算符>>现在可以命令 echo ,以避免 1 2,......的文件名结尾变得非常不可能解释为句柄号。此处不能使用分隔空间,因为此空间也会被命令 echo 写入文件中,这将导致文本文件中每个文件名的尾随空格。 / p>

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • call /?
  • chcp /?
  • dir /?
  • echo /?
  • exit /?
  • for /?
  • set /?

另请参阅Microsoft文章Using command redirection operators