2013-12-13 25 views
8

我編寫了一個批處理文件來啓動應用程序(應用程序不是我的,我無法修改它)。批處理文件本身接受一些參數。該應用程序接受其他參數。批處理文件使用SHIFT消耗所有選項,然後使用正確的環境啓動應用程序,並將其餘參數傳遞給應用程序。調用批處理文件的示例:保存批處理文件參數中的「=」(相等)字符

script.bat -opt-1 -opt-2 /opt-a /opt-b=value 

在此示例中,script.bat使用「-opt-1」和「-opt-2」。最後,它必須使用參數「/ opt-a」和「/ opt-b = value」調用原始應用程序。應用程序預計最後一個參數中的「=」符號,我無法更改它。當我直接從命令行調用應用程序時,它運行良好。

但是,當我從腳本調用它時,應用程序會收到2個參數「/ opt-b = value」:「/ opt-b」和「value」。如果我在調用應用程序時使用「%*」,則會保留「=」符號,但會傳遞所有參數(包括使用SHIFT跳過的參數)。

有什麼辦法只傳遞最後一個參數並保存「=」符號嗎?

+0

兩者也許你可以使用DOS的轉義字符:''^我 –

+0

試了一下,這是行不通的。 –

+0

也許你可以發佈你的腳本,以便人們可以複製和粘貼它,查看出了什麼問題,並提出修正。 – indiv

回答

3

打電話給你script.bat這樣:

script.bat -opt-1 -opt-2 /opt-a "/opt-b=value" 

和內部script.bat,調用應用程序是這樣的:

rem Consume -opt-1 
shift 
rem Consume -opt-2 
shift 
rem Call the application 
application %1 %~2 

編輯迴應的評論

確定。讓我們仔細查看這個問題。

下script.bat文件:

@echo off 
rem Consume -opt-1 
shift 
rem Consume -opt-2 
shift 
rem Call the application 
ECHO application %1 %~2 

正確(請注意ECHO命令)「呼叫」與包括等號的第二個參數的應用程序時,它的第四個參數用引號括起來,作爲下一個屏幕輸出顯示:

C:\> script.bat -opt-1 -opt-2 /opt-a "/opt-b=value" 
application /opt-a /opt-b=value 

然而,如果應用程序是一個批處理文件,然後將其從相同的問題的困擾原始的script.bat文件。你說過「當我直接從命令行調用應用程序時,它運行良好」。那麼,這是不是真的:

C:\> type application.bat 
@echo off 
rem ** application.bat ** 
echo 1: %1 
echo 2: %2 
echo 3: %3 
echo 4: %4 

C:\> application /opt-a /opt-b=value 
1: /opt-a 
2: /opt-b 
3: value 
4: 

一個批處理文件的參數可以用逗號,分號或等號分開,除了空格和製表符。這樣,如果應用程序預期「The」=「登錄最後一個參數」,那麼應用程序就無法成爲批處理文件,並且沒有意義用批處理文件而不是應用。

您是否使用真實應用程序測試了此解決方案?

+0

謝謝不幸的是,當我嘗試用下面的腳本上面的命令:!

 rem ** script.bat ** rem Consume -opt-1 shift rem Consume -opt-2 shift rem Call the application call %~dp0\application.bat %1 %~2 
 rem ** application.bat ** echo 1: %1 echo 2: %2 echo 3: %3 echo 4: %4 
當叫'script.bat -opt-1 -opt-2/opt-a「/ opt-b = value」,輸出爲:
 1: /opt-a 2: /opt-b 3: 4: 
而不是預期的(所有我想它傳遞的參數,因爲它們):
 1: /opt-a 2: /opt-b=value 3: 4: 

+0

對不起,我不知道如何添加一個格式良好的評論,像你上面(通過適當格式化文件爲文本塊)。關鍵是你的解決方案,正如我試過的那樣,通過'/ opt-b'而不是'/ opt-b = value'。 –

+0

@FlorentGeorges:我認爲這裏有一個困惑;閱讀我的答案中的編輯... – Aacini

1
FOR /f "tokens=1*" %%x IN ("%*") DO ECHO application %%y 

其中1是要跳過的參數的數量。


測試...主要.bat(q20572424.bat)

@ECHO OFF 
SETLOCAL 
ECHO master[%*] 
FOR /f "tokens=2*" %%x IN ("%*") DO CALL q20572424a.bat %%y 
FOR /f "tokens=1*" %%x IN ("%*") DO CALL q20572424a.bat %%y 
FOR /f "tokens=*" %%x IN ("%*") DO CALL q20572424a.bat %%x 
GOTO :EOF 

子公司.bat(q20572424a.bat)

@ECHO OFF 
SETLOCAL 
ECHO slave=[%*] 
FOR /f "tokens=2*" %%x IN ("%*") DO CALL q20572424b.bat %%y 
FOR /f "tokens=1*" %%x IN ("%*") DO CALL q20572424b.bat %%y 
FOR /f "tokens=*" %%x IN ("%*") DO CALL q20572424b.bat %%x 
GOTO :EOF 

第二附屬.bat(q20572424b.bat)

@ECHO OFF 
SETLOCAL 
ECHO subslave=[%*] 
GOTO :EOF 

結果:

從運行q20572424 -opt-1 -opt-2 /opt-a /opt-b=value

master[-opt-1 -opt-2 /opt-a /opt-b=value] 
slave=[/opt-a /opt-b=value] 
subslave=[] 
subslave=[/opt-b=value] 
subslave=[/opt-a /opt-b=value] 
slave=[-opt-2 /opt-a /opt-b=value] 
subslave=[/opt-b=value] 
subslave=[/opt-a /opt-b=value] 
subslave=[-opt-2 /opt-a /opt-b=value] 
slave=[-opt-1 -opt-2 /opt-a /opt-b=value] 
subslave=[/opt-a /opt-b=value] 
subslave=[-opt-2 /opt-a /opt-b=value] 
subslave=[-opt-1 -opt-2 /opt-a /opt-b=value] 

這似乎是正確的。在每種情況下,附屬批次逐字地接收參數;每次調用的主要參數數量爲2,1,0。

W7HP - 適合我!

+0

謝謝!這確實顯示了'echo'的正確答案。但是,如果您通過實際調用應用程序來更改'echo「,例如'call%〜dp0 \ application.bat',其中application.bat顯示其參數,結果爲:'1:/ opt-a,2:/ opt-b,3:value'。所以最後一個參數實際上被分成了2 ...預期的結果是:'1:/ opt-a,2:/ opt-b = value'。 –