如何在Windows批处理文件中转义保留字符

时间:2017-02-10 23:52:32

标签: batch-file

我正在尝试处理文件名列表,但不知道如何“转义”命令行以产生一致的输出,无论名称是包含纯文本还是特殊字符,如&符号,感叹号和百分比标志。如果我在四个名为:

的示例文件上运行我的代码(如下)
01 A Test.txt
02 & Test.txt
03 ! Test.txt
04 % Test.txt

输出结果为:

1 "01 A Test.txt"
2 "02 & Test.txt"
 "03 COUNT
4 "04Test.txt"

带有纯文本和&符号的文件名正确传递(只要它们用引号括起来),但感叹号和百分号会产生完全不同的结果。如何将变量传递给子例程,以便对所有四种情况进行相同处理(如果可能,从输出中删除引号)?谢谢。

:: CODE
:: ----
@echo off
setlocal EnableDelayedExpansion
set /a COUNT=0
for /f "tokens=*" %%g in ('dir /b *.txt') do (
  set /a COUNT=!COUNT! + 1
  call :LIST "%%g" !COUNT!                )
pause > nul
exit

:LIST
echo %2 %1
goto :EOF

2 个答案:

答案 0 :(得分:2)

试试这个:

@echo off
setlocal EnableDelayedExpansion
set /a COUNT=0
for /f "tokens=*" %%g in ('dir /b *.txt') do (
  set /a COUNT=!COUNT! + 1
  <nul set /p=!count!
  setlocal disableDelayedExpansion & (
    (echo( %%g)
  )
  setlocal enableDelayedExpansion

)

您可以在for循环内打开/关闭延迟扩展,以正确回显特殊字符。 <nul set /p=%%g打印一个没有新行的字符串 - 这是正确回显计数的必要条件,它应该在延迟扩展部分。并且它将在没有子程序的情况下更快地工作。

编辑首先打印计数。

答案 1 :(得分:2)

我认为这也会有效。

@echo off

set /a COUNT=0
for /f "tokens=*" %%g in ('dir /b *.txt') do (
    set /a COUNT+=1
    set "file=%%g"
    call :LIST file COUNT
)
pause
exit

:LIST
setlocal enabledelayedexpansion
echo !%2! !%1!
endlocal
goto :EOF

输出

1 01 A Test.txt
2 02 & Test.txt
3 03 ! test.txt
4 04 % test.txt
Press any key to continue . . .