Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何将任意字符串回显到批处理文件?_Windows_Batch File - Fatal编程技术网

Windows 如何将任意字符串回显到批处理文件?

Windows 如何将任意字符串回显到批处理文件?,windows,batch-file,Windows,Batch File,我有一个批处理文件(简化后)如下所示: @Echo Off SetLocal EnableDelayedExpansion MD "MyProgram^!" MD "MyProgram version 2" MD "MyProgram (next version)" MD "MyProgram O&O" Del Folders.txt Call :AddFoldersRecursive . EndLocal Goto :EOF :A

我有一个批处理文件(简化后)如下所示:

@Echo Off
SetLocal EnableDelayedExpansion
    MD "MyProgram^!"
    MD "MyProgram version 2"
    MD "MyProgram (next version)"
    MD "MyProgram O&O"  

    Del Folders.txt
    Call :AddFoldersRecursive .
EndLocal
Goto :EOF

:AddFoldersRecursive FolderPath
    Echo %~1>>Folders.txt
    For /D %%f In ("%~1\*") Do  Call :AddFoldersRecursive "%%~f"
Goto :EOF
在不同的情况下,面对不同类型的文件名时,它会带来各种错误:

  • 由于
    2>
    的解释不正确,无法回显
    MyProgram版本2
  • MyProgram(下一版本)
    无法回显,因为必须对括号进行
    ^
    转义
  • MyProgram O&O
    由于
    &
    符号,无法回显
  • MyProgram,无法回显代码>符号
是否有任何解决方案适用于所有此类情况(包括组合和嵌套等)


(ASCII很好——我现在不需要Unicode支持。)

编辑:采取2

For /D %%f In (*) Do (
    Set "Text=%%~dpnxf"
    SetLocal EnableDelayedExpansion
    Echo.!Text!>>files.txt
    EndLocal
)

启用延迟扩展会消耗感叹号,因此我在输出阶段禁用了它。我在这里做的是将它复制到另一个变量,这样我就可以进行替换,然后用
^&
替换
&
。这可能不适用于所有有效的文件名,但适用于您的示例:

:AddFoldersRecursive FolderPath
SetLocal DisableDelayedExpansion
    set "x=%~1"
    Set "x=%x:&=^&%"
    >>Folders.txt Echo %x%
    For /D %%f In ("%~1\*") Do  Call :AddFoldersRecursive "%%~f"
EndLocal
Goto :EOF

我只是想留下一条评论,因为你问了这个问题作为对我最后一个答案的评论,但我看不到任何不进行手动转义的简单方法。@DMan:很有趣,谢谢你的评论!如果有人能解决这个难题,我会感到惊讶——cmd.exe批处理文件具有最糟糕的字符串处理和最不规则、半自动的引用支持(显然是临时拼凑起来的,经过多年来实现cmd.exe的反复试验)。我已经对人们在Windows上成功地使用批处理文件而不仅仅是一个简单的运行程序列表感到惊讶。我有一个可怕的批处理文件怪物,它让我可以轻松地用各种编译器编译简单的C/C++程序进行测试。只要我把它加载到编辑器中,它就会崩溃。我讨厌必须更新它。哦,是的-多亏了微软决定标准化名称“Program Files(x86)”,括号问题不时地在批处理文件中出现(不仅仅是“echo”)。像Gabe一样,我无法重现这个问题,您指定的命令对我来说很好。您使用的是什么版本的Windows?您是否确实尝试过简化命令以查看它是否适用于您?已经尝试过:这不适用于带有感叹号的文件名,例如
Yahoo!Messenger
(是的,我还有:P)你知道,那块代码可以被
Dir/B>>files.txt
替换,以达到预期的效果。但我愿意回答原来的问题!是的,但那只是因为我在简化我实际上是在重复完整的路径,做一些检查,等等。。。不过还是要谢谢你的建议!好的,这是我的下一次尝试。它似乎涵盖了您列出的所有情况,加上%符号。是的,延迟切换可以处理所有特殊字符,只有
echo。
如果存在名为
echo
(无扩展名)的文件,则可能会失败,最好使用
echo(
这是安全且快速的,我认为引用示例是我不久前弄乱文件系统的结果(!),我没有注意到这一点。但请看我的示例脚本,例如,一个带有
&
的示例,这是完全正常的。如果输出文件中有引号,这有关系吗?如果有,
Echo“%~1”>>Folders.txt
应该可以用。这肯定很重要!!!但这甚至不是唯一的问题。我(再次)更新了我的问题,这次用一个例子演示了
MyProgram version 2
问题。很好,我刚得到一个脚本,其中显示了3/4的问题。:D我不认为我能在一个例子中得到4/4,但希望这足够了。好的,
>Folders.txt Echo%~1