我使用以下命令将数据从源文件导出为CSV格式的目标文件。
C:\MyApp.EXE -export "C:\Test\Sample.dat" "C:\Test\results.CSV"
但是,我需要通过更改源文件和目标文件多次重复相同的命令。像这样的东西
C:\MyApp.EXE -export "C:\Test\Sample01.dat" "C:\Test\results01.CSV"
C:\MyApp.EXE -export "C:\Test\Sample02.dat" "C:\Test\results02.CSV"
C:\MyApp.EXE -export "C:\Test\Sample03.dat" "C:\Test\results03.CSV"
我正在寻找创建批处理文件来完成这项工作。我在批处理文件中尝试了以下操作并运行,但它同时打开了多个控制台窗口。我希望所有这一切只在一个命令窗口中发生并一个接一个地运行命令。
cd "C:\Test\"
start MyApp.EXE -export "C:\Test\Sample.dat" "C:\Test\results.CSV"
start MyApp.EXE -export "C:\Test\Sample01.dat" "C:\Test\results01.CSV"
我希望代码能够创建一个批处理文件,该文件使用参数多次运行MyApp.exe
。
我使用PowerShell生成批处理文件,因此我不需要.bat文件中的变量。
答案 0 :(得分:1)
可以使用以下批处理文件完成此任务:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
for %%I in ("C:\Test\Sample*.dat") do (
set "FileNameCSV=%%~nI"
set "FileNameCSV=!FileNameCSV:Sample=results!"
C:\MyApp.exe -export "%%I" "%%~dpI!FileNameCSV!.csv"
)
endlocal
命令 FOR 在指定目录C:\Test
中搜索与通配符模式Sample*.dat
匹配的所有文件。对于每个文件,将完全限定的文件名(驱动器+路径+名称+扩展名)分配给循环变量I
。
FOR 循环的body命令块中的第一个命令仅将文件名分配给环境变量FileNameCSV
。在此行中,带有一个或多个感叹号的DAT文件名将不解释为大多数用户期望的。感叹号将被解释为延迟扩展环境变量引用的开始/结束。但是,根据相关文件名,这里没有问题。
第二个 SET 命令行使用简单的不区分大小写的字符串替换来将sample
中出现的所有results
替换为CSV文件名。
必须使用!VariableName!
语法使用延迟扩展引用环境变量。否则Windows命令行解释器cmd.exe
将在解析整个命令块时使用%VariableName%
展开(=替换)环境变量的引用,以(
开头并以匹配{{1}结束在 FOR 之前执行。
第三个命令行使用带有完整路径和扩展名的输入文件名执行您的应用程序,CSV文件名也带有输入文件的完整路径,但具有修改的文件名和不同的文件扩展名。
但更快的是,批处理代码也适用于具有)
的完全限定文件名的文件。
!
FOR 循环执行您的应用程序,每个@echo off
for %%I in ("C:\Test\Sample*.dat") do C:\MyApp.exe -export "%%I" "%%~dpI_%%~nI.csv"
ren "C:\Test\_Sample*.csv" "results*.csv"
作为输入文件,*.dat
作为输出文件,即_*.csv
,_Sample.csv
, ...
完成处理所有DAT文件到_Sample01.csv
,results.csv
,...
后,将重命名CSV文件
要将所有results1.csv
正确重命名为_Sample*.csv
,必须添加其他下划线。当前和新文件名中通配符results*.csv
之前的字符数必须相同。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
*
echo /?
endlocal /?
for /?
ren /?
set /?
但我真的不明白为什么所有这些都是由Windows命令行解释器setlocal /?
执行的批处理文件完成的,如果这个批处理文件确实是由脚本解释器cmd.exe
执行的PowerShell脚本创建的。所有这些都可以通过使用适当的PowerShell脚本函数在PowerShell脚本中完成。