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

Batch file 如何在Windows批处理文件中转义保留字符,batch-file,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" 带有纯文本和符号的文件名可以正确通

我正在尝试处理一个文件名列表,但不知道如何“转义”命令行以生成一致的输出,而不管该名称是包含纯文本还是包含特殊字符,如符号、感叹号和百分号。如果我在四个示例文件上运行代码(如下),这些文件的名称为:

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
试试这个:

@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

)
@echo关闭
setlocal EnableDelayedExpansion
设置/a计数=0
对于('dir/b*.txt')中的/f“tokens=*”%%g,请执行以下操作(
设置/a计数=!计数!+1
试试这个:

@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

)
@echo关闭
setlocal EnableDelayedExpansion
设置/a计数=0
对于('dir/b*.txt')中的/f“tokens=*”%%g,请执行以下操作(
设置/a计数=!计数!+1

我认为这也会起作用

@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 . . .

我认为这也会起作用

@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 . . .

Count是输出示例中的第一个。谢谢。这与我一直试图做的非常接近。我现在唯一的问题是如何在子例程中执行相同的操作。@WallyWalters-您也可以在子例程中打开/关闭延迟扩展,并使用参数而不是标记。另外,请检查sqashman的answerCount在输出示例中的第一个足够了。谢谢。这与我一直试图做的非常接近。我现在唯一的问题是如何在子例程中做同样的事情。@WallyWalters-您也可以在子例程中打开/关闭延迟扩展,并使用参数而不是标记。还可以检查sqashman的回答