如何使用延迟扩展来处理批处理脚本中的值
How to use delayedexpansion to handle value in batch script
我在批处理脚本中读取 CSV 文件的内容时遇到问题。我有一系列文件说 My_A_File.csv, My_B_File.csv ... My_Z_File.csv
。我面临的问题是阅读其中的特殊字符。因此,想要读取延迟扩展关闭的值。
当我读取带有 disabledelayedexpansion 的块中的值时,它们是空的!我该如何处理?
脚本:
@echo off
setlocal enabledelayedexpansion
for /L %%g in (65,1,90) do (
cmd /c exit /b %%g
set codeval=!=ExitCodeAscii!
set fileToReadFrom=My_!codeval!_File.csv
if exist My_!codeval!_File.csv (
echo Outer-!fileToReadFrom!
echo Outer-!codeval!
setlocal disabledelayedexpansion
echo Inner-%fileToReadFrom%
echo Inner-%codeval%
endlocal
)
)
输出:
Outer-My_A_File.csv
Outer-A
Inner-
Inner-
这是延迟扩展应该如何 work.However 您可以使用 CALL
访问变量,但这会影响性能(请注意您不能 CALL FOR ):
@echo off
setlocal enabledelayedexpansion
for /L %%g in (65,1,90) do (
cmd /c exit /b %%g
set codeval=!=ExitCodeAscii!
set fileToReadFrom=My_!codeval!_File.csv
if exist My_!codeval!_File.csv (
echo Outer-!fileToReadFrom!
echo Outer-!codeval!
setlocal disabledelayedexpansion
call echo Inner-%%fileToReadFrom%%
call echo Inner-%%codeval%%
endlocal
)
)
或者你可以使用 pipes.Which 也会影响性能(现在你可以使用
break|for "usebackq" %%a in ("Inner-%%fileToReadFrom%%") do @echo %%~a
):
@echo off
setlocal enabledelayedexpansion
for /L %%g in (65,1,90) do (
cmd /c exit /b %%g
set codeval=!=ExitCodeAscii!
set fileToReadFrom=My_!codeval!_File.csv
if exist My_!codeval!_File.csv (
echo Outer-!fileToReadFrom!
echo Outer-!codeval!
setlocal disabledelayedexpansion
break|echo Inner-%%fileToReadFrom%%
break|echo Inner-%%codeval%%
endlocal
)
)
使用子程序处理禁用延迟扩展的代码如下:
@echo off
rem skip subroutine code
goto :toMain
:toProcessDDE
rem subroutine to process delayed expansion disabled
setlocal disabledelayedexpansion
echo Inner-%fileToReadFrom%
echo Inner-%codeval%
endlocal
exit /B
:toMain
setlocal enabledelayedexpansion
for /L %%g in (65,1,90) do (
cmd /c exit /b %%g
set codeval=!=ExitCodeAscii!
set fileToReadFrom=My_!codeval!_File.csv
if exist My_!codeval!_File.csv (
echo Outer-!fileToReadFrom!
echo Outer-!codeval!
call :toProcessDDE
)
)
阅读
我在批处理脚本中读取 CSV 文件的内容时遇到问题。我有一系列文件说 My_A_File.csv, My_B_File.csv ... My_Z_File.csv
。我面临的问题是阅读其中的特殊字符。因此,想要读取延迟扩展关闭的值。
当我读取带有 disabledelayedexpansion 的块中的值时,它们是空的!我该如何处理?
脚本:
@echo off
setlocal enabledelayedexpansion
for /L %%g in (65,1,90) do (
cmd /c exit /b %%g
set codeval=!=ExitCodeAscii!
set fileToReadFrom=My_!codeval!_File.csv
if exist My_!codeval!_File.csv (
echo Outer-!fileToReadFrom!
echo Outer-!codeval!
setlocal disabledelayedexpansion
echo Inner-%fileToReadFrom%
echo Inner-%codeval%
endlocal
)
)
输出:
Outer-My_A_File.csv
Outer-A
Inner-
Inner-
这是延迟扩展应该如何 work.However 您可以使用 CALL
访问变量,但这会影响性能(请注意您不能 CALL FOR ):
@echo off
setlocal enabledelayedexpansion
for /L %%g in (65,1,90) do (
cmd /c exit /b %%g
set codeval=!=ExitCodeAscii!
set fileToReadFrom=My_!codeval!_File.csv
if exist My_!codeval!_File.csv (
echo Outer-!fileToReadFrom!
echo Outer-!codeval!
setlocal disabledelayedexpansion
call echo Inner-%%fileToReadFrom%%
call echo Inner-%%codeval%%
endlocal
)
)
或者你可以使用 pipes.Which 也会影响性能(现在你可以使用
break|for "usebackq" %%a in ("Inner-%%fileToReadFrom%%") do @echo %%~a
):
@echo off
setlocal enabledelayedexpansion
for /L %%g in (65,1,90) do (
cmd /c exit /b %%g
set codeval=!=ExitCodeAscii!
set fileToReadFrom=My_!codeval!_File.csv
if exist My_!codeval!_File.csv (
echo Outer-!fileToReadFrom!
echo Outer-!codeval!
setlocal disabledelayedexpansion
break|echo Inner-%%fileToReadFrom%%
break|echo Inner-%%codeval%%
endlocal
)
)
使用子程序处理禁用延迟扩展的代码如下:
@echo off
rem skip subroutine code
goto :toMain
:toProcessDDE
rem subroutine to process delayed expansion disabled
setlocal disabledelayedexpansion
echo Inner-%fileToReadFrom%
echo Inner-%codeval%
endlocal
exit /B
:toMain
setlocal enabledelayedexpansion
for /L %%g in (65,1,90) do (
cmd /c exit /b %%g
set codeval=!=ExitCodeAscii!
set fileToReadFrom=My_!codeval!_File.csv
if exist My_!codeval!_File.csv (
echo Outer-!fileToReadFrom!
echo Outer-!codeval!
call :toProcessDDE
)
)
阅读