我需要获取文件夹中所有文件的名称,以便在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关于使用命令重定向运算符的文章。