我必须在Windows命令行上为42个美国州分别运行42次可执行文件(用C#编写)。我写了一个批处理文件来自动化这个过程。可执行文件的第一个用户输入是1,第二个是状态缩写(AL,AZ,CT等)。我写了以下脚本来做到这一点:
@echo off
for /f "tokens=1 delims=" %%x in (CropHailStates.txt) do (
(echo 1 & echo %%x)|Z:\Models\LossCalc.exe
)
CropHailStates.txt文件中的每一行都包含州名缩写,如下所示:
AL
AZ
CT
现在处于手动模式,当在第一个提示输入1并在第二个输入AL时,C#程序读取一个名为" AL.Even.CropLoss.csv"的文件。但是当我运行批处理脚本自动执行它时,我收到错误消息,说明文件" AL .Even.CropLoss.csv"找不到。问题与AL之后的额外空格有关。插入状态缩写后,它以某种方式添加空格。这就像写完状态缩写后按空格键,但在按Enter键之前。
如何摆脱文件名中的额外空格?
答案 0 :(得分:3)
问题是在处理带括号的代码块时管道解析器的工件。
问题的根源由jeb在Why does delayed expansion fail when inside a piped block of code?描述。 管道的每一侧都在新的CMD / C过程中执行。
当多行括号内的块被管道传输时,解析器必须将整个块重新打包成一行,以便可以通过CMD / C执行
(
echo line 1
echo line 2
) | findstr "^"
管道的左侧执行:
C:\WINDOWS\system32\cmd.exe /S /D /c" ( echo line 1 & echo line 2 )"
您可以看到引入的额外空格。
即使你的代码已经在一行上,它仍然会通过引入那些讨厌的空格的同一个解析器。
我知道三种相对简单的解决方案,可以在不需要临时文件的情况下消除不需要的空间。
1)在明确获得您正在寻找的确切行为的地方添加额外的CMD / C
@echo off
for /f "tokens=1 delims=" %%x in (CropHailStates.txt) do (
cmd /c "echo 1&echo %%x"|Z:\Models\LossCalc.exe
)
2)将部分命令存储在变量中并延迟扩展直到执行CMD / C
@echo off
setlocal
for /f "tokens=1 delims=" %%x in (CropHailStates.txt) do (
set "cmd=&echo %%x"
(echo 1%%cmd%%)|Z:\Models\LossCalc.exe
)
3)引入换行变量的延迟扩展 - 由jeb开发的令人兴奋的技术,他在我提供的相同SO链接中描述了
@echo off
setlocal
set ^"LF=^
%= This creates a linefeed character =%
"
for /f "tokens=1 delims=" %%x in (CropHailStates.txt) do (
(echo 1%%LF%%echo %%x%%LF%%)|Z:\Models\LossCalc.exe
)
答案 1 :(得分:2)
(echo 1& echo %%x)>tempfile.txt
Z:\Models\LossCalc.exe <tempfile.txt
del tempfile.txt
应该提供没有尾随空格的数据
答案 2 :(得分:-1)
要摆脱你可以做的最后一个字符(空白):
@echo off
setlocal EnableDelayedExpansion
for /f "tokens=1 delims=" %%x in (CropHailStates.txt) do (
set "result=%%x"
(echo 1 & echo !result:~0,-1!)|Z:\Models\LossCalc.exe
)
希望它有所帮助。