2012-09-04 106 views
0

我有2个批处理文件。将参数从一个批处理文件传递到另一个批处理文件

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

批处理文件1

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

第二批文件使用作为输入自变量的SubfolderNameAndPath以及所有存在于每个子文件夹中的文件执行一个Evaluate.exe。它将Evaluate.exe的结果保存到文本文件“results”中,其扩展名为每次访问子文件夹的名称。 (results_%~n1.txt)。

批处理文件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

待办事项'%SubfolderNameAndPath%'中的任何值在名称和/或路径中都有空格? – LittleBobbyTables

+0

@LittleBobbyTables路径和'%SubfolderNameAndPath%'都不包含任何空格。 – athanell

回答

1

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

但是既然你不用做任何事情%SubfolderNameAndPath%无论如何,你应该消除它。

其次,你需要补偿包含空格的路径,所以希望下面的代码能适合你。要做到这一点,批处理为传递给它们的参数使用一个特殊的符号来移除它们周围的双引号。所以,如果%1 = "This string",那么%~1 = This string。另外,如果%1 = This string,则%~1仍然= This string。所以使用%~1表示法没有缺点,除非你想保留任何双引号。

所以,诠释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年9月5日15:21

这个怎么样你喜欢吗?而不是调用seprate批次:(以上可以把所有在同一行,只是去掉括号)

我假设输出

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"

+0

我已经尝试了你提出的建议,但它似乎让我在某种程度上与之前相同的情况。因为我所有的文件名以及所有子文件夹(都是这些文件)不包含任何空格或任何使用双引号的运算符似乎并不需要我的情况。两个脚本在独立运行时确实运行良好。但是,当第一个调用第二个时,仍然出现问题.... – athanell

+0

好的,给我一个示例目录内容和您尝试构建的行样本。 –

+0

我的最新编辑如何为你工作? –

相关问题