批處理腳本中是否有一種方法可以在不破壞語法的情況下在每行的開頭添加多個空格,并按照下面的示例在每行上保留空格?
gacutil /u ^
Microsoft.IdentityModel.Clients.ActiveDirectory,^
Version=2.28.0.725,^
Culture=neutral,^
PublicKeyToken=31bf3856ad364e35
目標是不僅在使用時gacutil.exe而且在撰寫批處理命令時都具有更好的可讀性
uj5u.com熱心網友回復:
每個可執行檔案都有自己的規則集,用于將可執行檔案名后的字串拆分為可執行檔案進一步處理的引數值。
windows 命令處理器cmd.exe將雙引號字串外的水平制表符、普通空格、逗號、分號、等號和 OEM 編碼的不間斷空格(具有十六進制值 FF 的位元組)解釋為引數分隔符,如其所見在命令提示符視窗中test.cmd僅使用命令列運行帶有名稱的批處理檔案@echo %0 $1 $2 $3 $4
test argument1,,,"argument 2";;;"argument 3 contains a comma ',' a semicolon ';' an equal sign '=' and multiple spaces"===argument4
導致輸出
test argument1 "argument 2" "argument 3 contains a comma ',' a semicolon ';' an equal sign '=' and multiple spaces" argument4
,,,and;;;和===被解釋為引數字串分隔符。
在全域程式集快取工具 gacutil.exe將裂變傳遞給它來比較不同的引數字串字串cmd.exe。逗號和等號不被解釋為引數分隔符。只有普通空格字符被解釋為引數分隔符,除了普通空格在雙引號引數字串內。
對于 Windows 可執行檔案,引數字串之間的引數分隔符的數量并不重要,這很常見。因此,如果兩個引數字串之間僅使用一個空格或多個空格,則無關緊要。
在批處理檔案中使用以下幾行會發生什么?
gacutil /u ^
Microsoft.IdentityModel.Clients.ActiveDirectory,^
Version=2.28.0.725,^
Culture=neutral,^
PublicKeyToken=31bf3856ad364e35
請先閱讀:Windows 命令解釋器 (CMD.EXE) 如何決議腳本?
Windows 命令處理器cmd.exe逐行讀取批處理檔案,并在讀取一行時將回車 換行替換為換行。
行尾的插入字符^被解釋cmd.exe為換行符換行符的轉義字符,導致將下一行與當前行連接起來,重復直到到達批處理檔案的末尾或找到換行符逃脫了^。在批處理檔案中的行連接程序中沒有洗掉任何字符。
批處理檔案中以上各行的結果,每行三個前導正常空格是:
gacutil /u Microsoft.IdentityModel.Clients.ActiveDirectory, Version=2.28.0.725, Culture=neutral, PublicKeyToken=31bf3856ad364e35
gacutil命令列開頭留下的三個前導空格被洗掉cmd.exe,但所有其他空格都保留了下來,因為cmd.exe不知道它們是否對接下來運行的程式/腳本很重要。因此/u,在批處理檔案的不同行中指定的其他字串之間有四個空格和三個空格。
gacutil.exe 現在將命令列解釋為以下引數串列:
/uMicrosoft.IdentityModel.Clients.ActiveDirectory,Version=2.28.0.725,Culture=neutral,PublicKeyToken=31bf3856ad364e35
結果是一條錯誤訊息,因為gacutil.exe在這種情況下必須僅使用兩個引數運行:
/u指示全域程式集快取工具從全域程式集快取中卸載程式集的選項- 和程式集名稱
Microsoft.IdentityModel.Clients.ActiveDirectory,Version=2.28.0.725,Culture=neutral,PublicKeyToken=31bf3856ad364e35。
因此,在批處理檔案中未洗掉的程式集名稱引數字串的各個部分之間使用的縮進空格cmd.exe使命令列對gacutil.exe.
由于這個原因,在這種情況下不可能用縮進空格在多行上定義程式集名稱引數字串,因為如何cmd.exe連接行并保留空格以及如何gacutil.exe將傳遞給它的字串拆分cmd.exe為引數。
不同的可執行檔案可以將字串拆分為不同的引數值串列,因此將可執行檔案的引數寫在帶有縮進空格的批處理檔案中的多行上可能適用于該可執行檔案。
但是,對于此用例,可以在批處理檔案中使用以下語法:
gacutil /u ^
^"Microsoft.IdentityModel.Clients.ActiveDirectory,^
Version=2.28.0.725,^
Culture=neutral,^
PublicKeyToken=31bf3856ad364e35^"
只要將整個程式集名稱引數字串括在雙引號中,全域程式集快取工具在程式集名稱中的逗號后沒有一個或多個空格的問題。出于這個原因,程式集名稱字串的"開頭和"結尾都有一個。但是^對于 Windows 命令處理器,這兩個雙引號必須轉義,否則cmd.exe會將^每行末尾的插入字符解釋為文字字符而不是轉義字符。
分布在多行上的命令列必須解釋cmd.exe為沒有雙引號中的引數字串的行,以便將每個^解釋為轉義字符,而程式集名稱在gacutil.exe使用命令列最終運行時實際用雙引號括起來:
gacutil /u "Microsoft.IdentityModel.Clients.ActiveDirectory, Version=2.28.0.725, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
是的,這很奇怪。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/395864.html
