如何在Windows批处理脚本中调用IF-ELSE IF条件?

时间:2017-08-20 17:20:55

标签: windows batch-file

我们在一个文件夹中有数百个* .pdf文件。每个* .pdf的命名约定为ABC_100_filename.pdfABC_200_filename.pdfABC_300_filename.pdf

在批处理脚本中,我们调用* .exe文件,如下所示:

call test.exe 100  filename
call test.exe 200  filename
call test.exe 300  filename

由于没有 IF 条件来验证文件,我们错误地加载了ID不正确的文件。

预期结果:应为文件test.exe 100调用ABC_100_Testfile.pdf

我们错误地调用test.exe 200而不是此文件执行。

如何编写 IF - ELSE IF 条件以在批处理脚本中调用.exe文件。

if %str1:~0,7%==ABC_100 (call test.exe 100 filename)
pause
if %str2%==ABC_200 (call test.exe 200 filename)

2 个答案:

答案 0 :(得分:5)

  • 不需要call .exe(只有其他批处理文件可以在以后返回)
  • 提供传递给test.exe的编号包含在_中,使用解析。
@Echo off
For /f "tokens=1-2* delims=_" %%A in (
    'Dir /B/A-D "*_*_*.pdf"'
) Do test.exe %%B "%%A_%%B_%%C"

使用固定结构分隔具有不同字符的元素的文件名可以使用for / f(请参阅ss64.com/nt/for_f)轻松解析,将分隔的标记分发到相邻的元变量。

file name    : ABC_100_filename.pdf
delims       :    _   _
tokens       :  1 _ 2 _ * (rest)
for variable : %%A %%B %%C

答案 1 :(得分:2)

你需要一个delayed variable expansion的for循环。每当循环体需要替换标题定义的变量以外的其他变量时,这是必要的。

SETLOCAL ENABLEDELAYEDEXPANSION
for /f %%i in ('dir /b *.pdf') do (set pdf=%%~ni & set str=!pdf:~4,3! & set fname=!pdf:~8! & test.exe !str! !fname!)

我不确定你为什么需要call可执行文件,但我认为你明白了。

多行版本:

SETLOCAL ENABLEDELAYEDEXPANSION
for /f %%i in ('dir /b *.pdf') do (
  set pdf=%%~ni
  set str=!pdf:~4,3!
  set fname=!pdf:~8!
  test.exe !str! !fname!
)

现在一步一步解释:

由于默认情况下延迟扩展已关闭,我们首先需要在第1行打开它.for循环将在引号中运行命令,此处为dir /b *.pdf。对于每一行输出,它将%i设置为其值unroll the loop body,方法是替换其值并执行它。这是我们需要延迟扩张的地方。

我们说第一行是ABC_100_foo.pdf%i的值也是 set pdf=ABC_100_foo set str=!pdf:~4,3! set fname=!pdf:~8! test.exe !str! !fname! 。对于这一行,循环体现在看起来像这样:

%%~ni

表达式100已替换为没有扩展名的文件名。接下来的两个语句从变量pdf中提取数字foo和文件名%%i,最后调用可执行文件。现在,对于输出中剩余的行,循环体将展开并再次使用%i中的不同值执行。

另请注意,在文件中运行时,您需要放置%i,在提示时运行configurations.all { resolutionStrategy { force 'org.objenesis:objenesis:2.1' } }