在Windows批处理脚本中管理数据时,防止额外的空格

时间:2017-12-07 20:12:43

标签: batch-file

我必须在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键之前。

如何摆脱文件名中的额外空格?

3 个答案:

答案 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 
)

希望它有所帮助。