使用批處理文件多年後,我驚訝地發現等號'='被認爲是參數分隔符。分析包含=
鑑於這種測試腳本:
echo arg1: %1
echo arg2: %2
echo arg3: %3
和調用:
test.bat a=b c
輸出爲:
arg1: a
arg2: b
arg3: c
這是爲什麼和如何能避免?我不希望劇本的用戶解釋這個怪癖並引用「a = b」,這是違反直覺的。
此批處理腳本是在Windows 7
=====編輯=====
運行多一點背景:寫一個bat文件時啓動Java我遇到了這個問題應用。我想在bat文件中使用一些參數,然後將剩下的傳給java應用程序。所以我第一次嘗試做shift
,然後重建參數列表(因爲%*
不受shift
的影響)。它看起來是這樣的,這時候我發現了問題:
rem Rebuild the args, %* does not work after shift
:args
if not "%1" == "" (
set ARGS=!ARGS! %1
shift
goto args
)
下一步是不使用轉向了,但通過一次從%*
刪除一個字符,直到一個空間,而實現由指針偏移遇到:
rem Remove the 1st arg if it was the profile
set ARGS=%*
if not "%FIRST_ARG%" == "%KNOA_PROFILE%" goto remove_first_done
:remove_first
if not defined ARGS goto remove_first_done
if "%ARGS:~0,1%" == " " goto remove_first_done
set ARGS=%ARGS:~1%
goto remove_first
:remove_first_done
但這是醜陋的,在某些情況下,我可能還沒有考慮失敗。所以最後我決定編寫一個Java程序來處理參數解析!在我的情況下,這很好,因爲我啓動了一個服務器,額外的Java調用的懲罰是最小的。令人難以置信的是,有時你最終會做什麼。
您可能想知道爲什麼我沒有照顧Java應用程序本身的參數?答案是我希望能夠傳遞像-Xmx這樣的JVM選項,這些選項在調用java之前必須被處理。
逗號,分號和等號是命令參數和FOR集的分隔符。通過分隔符的唯一方法是用引號括起來:test「a = b」c – Aacini
使用'enabledelayedexpansion'並假定第一個參數仍在%1中,相當乾淨的解決方案可能如下所示: 'setlocal enabledelayedexpansion& set args =%*& if'%1「==」%KNOA_PROFILE%「(\t set args =!args:%1 =!)'_split lines on'&',我無法輸入多行comments_ – eremmel