2012-09-04 108 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

我的最新編輯如何爲你工作? –

相關問題