我们在一个文件夹中有数百个* .pdf文件。每个* .pdf的命名约定为ABC_100_filename.pdf
或ABC_200_filename.pdf
或ABC_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)
答案 0 :(得分:5)
call
.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' } }
。