我有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%
不包含任何空格。文件夹的路径都没有。
我非常感谢你的帮助。
答案 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"