Batch file 为什么批处理文件为;发送至;获取路径中有空格的文件夹的所有文件名无效吗?

Batch file 为什么批处理文件为;发送至;获取路径中有空格的文件夹的所有文件名无效吗?,batch-file,cmd,filenames,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

我需要获得文件夹中所有文件的名称,以便在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”

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

命令行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 >"%~f1\FolderContents.txt"
chcp %cp% >nul
exit
命令DIR仅输出

  • 由于选项
    /A-D
  • 由于选项
    /B
  • 由于
/ON
  • 没有路径,因为没有使用选项
    /S
    获取包含所有子目录的列表
  • %~f1
    被命令处理程序替换为文件夹名,路径,不带引号

    在我看来,在退出整个命令过程之前,确定此命令过程的活动代码页以及仅此命令过程的活动代码页并还原代码页也是不需要的,因此第二行也是最后一行也是不需要的

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

    @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会在文本文件中的每个文件名上留下一个尾随空格

    @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
    
    要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

    • 呼叫/?
    • chcp/?
    • dir/?
    • echo/?
    • 退出/?
    • 获取/?
    • 设置/?

    另请参阅Microsoft关于的文章。

    谢谢。对不起,我看不见这个。我做了你的改变,效果很好。我对批处理命令非常陌生,您可能已经知道了。我还有一个问题。我用它从文件夹中取出所有文件名,并将它们放入电子表格中进行批量处理。一个新的需求出现了,我希望能够在父文件夹上运行它,并让命令在每个子文件夹中创建一个新文件。结构如下所示:批量处理(仅子文件夹-无文件)批量处理\u作业\u 1批量处理\u作业\u 2等…打开命令提示窗口并运行
    获取/?
    。您可以阅读(Set)DO命令中/D%变量的
    。当
    Set
    。\*
    时,将为父文件夹的每个子文件夹执行循环体(单个命令或块)。在(..\*)中为/D%#执行@echo%#
    并在批处理文件中使用
    %#
    和替换
    @echo%#
    的命令提示符窗口中运行此命令。