将参数从一个批处理文件传递到另一个批处理文件

时间:2012-09-04 17:04:07

标签: batch-file

我有2个批处理文件。

第一个需要输入参数,该参数是父文件夹的路径。它读取父文件夹中所有子文件夹的名称,并为每个子文件夹执行第二个批处理文件。

BATCH FILE 1

@echo off
for  /d %%Y in (%1/*) do (  
set SubfolderNameAndPath=%%Y
call batch2.bat %SubfolderNameAndPath% 
)

第二个批处理文件使用SubfolderNameAndPath作为输入参数,并为每个子文件夹中存在的所有文件执行Evaluate.exe。它将Evaluate.exe的结果保存到文本文件"结果"带有一个扩展名,其中包含每次访问的子文件夹的名称。 (results_%~n1.txt)。

BATCH FILE 2

@echo off
for  %%X in (%1/*) do (  
echo Evaluate.exe  %%X AnotherArgumentHere -o results_%~n1.txt   
)

当我运行batch1(batch1.bat ParentFolderPath)时,即使它似乎调用了batch2.bat,也不会执行batch2.bat。我认为我为batch2.bat定义输入参数的方式出了问题,但我无法弄清楚它是什么。

%SubfolderNameAndPath%不包含任何空格。文件夹的路径都没有。 我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

嗯,首先,当你在一个括号内对,你不能设置一个变量,然后用%的访问它。您必须先(在for循环之前)setlocal enabledelayedexpansion,然后使用!而不是%来访问您的变量。

但是,既然你没有对%SubfolderNameAndPath%做任何事情,你应该消除它。

其次,你需要补偿包含空格的路径,所以我希望下面的代码可以为你解决。为此,批处理为传递的参数使用特殊表示法来删除它们周围的双引号。因此,如果%1 = "This string",则%~1 = This string。此外,如果%1 = This string,则%~1仍然= This string。因此,使用%~1表示法没有任何缺点,除非您想保留任何双引号。

因此,int batch1.bat,我们会移除围绕%1的任何潜在引号,然后在%~1/*周围放置双引号,并且还引用%%Y以防万一里面有空格。

batch1.bat

@echo off
for  /d %%Y in ("%~1/*") do call batch2.bat "%%~Y"

然后我们为batch2.bat做同样的事情,但更多的事情。

batch2.bat

@echo off
for  %%X in ("%~1/*") do (
  echo Evaluate.exe  "%%~X" AnotherArgumentHere -o "results_%~n1.txt"
)

编辑: 2012/09/05 15:21

这是怎么抓住你的?而不是调用单独的批处理:

for /d %%x in (%1\*) do (
  for /f "tokens=*" %%y in ( 'dir /b /a:-d "%%~dpnxx"' ) do (
    echo Evaluate.exe %%~nxy AnotherArgumentHere -o "results_%%~nxx.txt" 
  )
)

(以上内容可以全部放在一行,只需删除括号即可。)

我假设输出是:
Evaluate.exe <file_name> AnotherArgumentHere -o "results_<directory_name>.txt"