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



我需要获取文件夹中所有文件的名称,以便在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 FolderFolderContents.txt"

这几行批处理代码中有几个错误。

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

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

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

留给重定向运算符>的数字可以很容易地将其解释为句柄编号。尽管代码页码足够大,不会被解释为句柄编号,但最好在代码中为最后一个重定向运算符>留出一个空间,因为%cp%已被代码页码所取代。

对于您的任务,一个真正有效且额外简化的代码是:

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

命令DIR仅输出

  • 由于选项/A-D而导致的文件名
  • 由于选项/B,采用裸格式
  • 由于选项/ON而按名称排序
  • 并且由于没有使用选项CCD_ 13来获得包括所有子目录的列表而没有路径

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

好吧,从我的角度来看,确定这个并且只有这个命令过程的活动代码页,并在退出整个命令过程之前恢复代码页也不是真正需要的,因此第二行和最后一行也是不必要的。

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

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

重定向运算符>>现在可以命令echo,以避免文件名不太可能以 1 2…结尾。。。被解释为句柄编号。此处不能使用分隔空间,因为该空间也会被写入文件中,因为命令echo会占用该空间,这将导致文本文件中的每个文件名都有一个尾随空格。

为了理解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面。

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

另请参阅Microsoft关于使用命令重定向运算符的文章。

相关内容

最新更新