題 使用反斜杠轉義cmd.exe中的字符(以runas命令為例)


我看到插入符號是記錄的轉義字符。

但是,我有一個例子顯示雙引號字符, ^ 不起作用你必須使用 \

C:\>runas /user:Administrator "cmd /k dir \"%userprofile%\""

為什麼會這樣,它在哪裡記錄?


4
2017-08-30 09:40


起源




答案:


其中一個例子 RUNAS /? 顯示了語法。插入符是逃脫字符 CMD.EXE 但在Windows中,個別程序可以自由地實現自己的轉義字符和通配符。


4
2017-08-30 10:00



有趣..以及順便說一句..什麼是cmd.exe在最後使用未轉義的引號?它是否保留它們,如果是這樣的話為什麼......或者它是否將它們移除..如果是這樣,為什麼它們首先需要它們? - barlop
@barlop:見邁克爾 回答。 - Dennis Williamson
你確定\“是由runas解釋而不是由cmd.exe解釋?編譯這個w.c pastebin.com/28Q2Wxxr  to w.exe比較a)w“a a”b)w \“a a”c)w ^“a a ^”注意b特別是會發生什麼。我想這是將\作為轉義字符的cmd shell。 - barlop
雖然它不是cmd.exe解釋它,它也不是程序,它是分裂args的運行時。我不確定是否會稱該程序可以自由實現它。更像是編譯器實現它的方式,或者編譯器為程序實現它的方式。任何用我編寫的程序,ms visual c,都會解析argsv“soly” msdn.microsoft.com/en-us/library/a1y7w461.aspx - barlop


在cmd中, \ 不  逃逸 "。這是一個快速證明和解釋:

  1. echo "" & echo 1。 (& 是cmd中的特殊字符, left & right 意思是跑 left 然後運行 right。)我們可以看到兩者 echo "" 和 echo 1 運行成功。

  2. 接下來,運行 echo " & 1234。我們可以看到輸出是 " & 1234。這是因為開場 " 尚未關閉,因此它之後的所有內容都被解釋為字符串,包括特殊字符 &

  3. echo "\" & 1234

    • 如果 \ 確實逃脫了以下 ", 開幕式 " 不會被關閉和chars & 1234 將被解釋為字符串的一部分。

    • 如果 \ 未能逃脫以下 " 以下 " 將關閉字符串和 & 1234 將  被解釋為字符串的一部分。

    在輸出中,我們沒有看到 & 1234 被解釋為字符串的一部分。 這證明了這一點 \ 未能逃脫 "

什麼逃脫了 " 在參數傳遞的引號內?而 ^ 將在引號之外工作(很容易通過證明 echo ^" & echo 1),它不會在引號內轉義引號。

的確,我們怎樣才能得到一些簡單的東西 echo """  &  echo 1 上班?

^ 炭? ...不, echo "^"" & echo 1 輸出 "^"", 並不是 """

關於 " char本身? ...不, echo """" & echo 1  輸出 """", 並不是 """

事實上, 沒有什麼可以逃脫的 " 在參數傳遞的引號內。您可以對此進行幾年的深思熟慮並且無法解決問題。這只是cmd腳本的一些固有限制。

然而,好消息是你最有可能 決不 遇到需要這樣做的情況。當然,沒有辦法得到 echo """  &  echo 1 工作,但這不是一個大問題,因為它只是一個你可能永遠不會遇到的人為問題。

例如,考慮一下 runas。它工作正常,無需逃脫 " 在引號內因為 runas 知道 沒有辦法這樣做並進行內部調整以解決它。 runas 發明了自己的解析規則(runas /flag "anything even including quotes"並且不會以通常的方式解釋cmd參數。這些特殊語法的官方文檔非常稀疏(或不存在)。除了 /? 和 help,這主要是反複試驗。


6
2017-08-26 01:33





\ 標誌使翻譯將下一個標誌解釋為 字符 而不是 識別碼

你在代碼中也看到了很多東西:

"Hello \"World\""

這是 解讀 如

Hello "World"

在你的例子中,為了傳遞參數 cmd,它需要用“”括起來。但自從爭論到了 cmd 包含“(這將結束附件)它們被附加 \。如果“”不會在那裡,那麼 /k dir \"%userprofile%\" 本來應該被解釋為參數 runas,不是 cmd

他們將%userprofile%括起來的原因是因為這是一個環境變量,並且將被可能包含空格的文本所取代,這(由於與上述相同的原因)會使參數變為 cmd 不正確。


3
2017-08-30 13:48



當第二個參數(程序參數)有空格時,我認為RunAs“需要”引號。否則它認為它被賦予了比它更多的參數。從理論上講,runas可能已被編寫(我的意思是編碼)將其帶到最後,因為一個參數沒有必要引用。與此形成對比。 cmd.exe,例如cmd / c dir a b將-bir作為一個參數。 - barlop
另外,一個更複雜的觀點,它看起來像runas可能沒有\“但不能,因為它將”作為開始和下一個“作為結束。如果它只是把最外面的那些作為開始並結束,那麼它就不需要中間的“甚至像這樣令人討厭的外觀C:\> runas / user:管理員“runas / user:Administrator \”cmd / k dir \“%userprofile%\”\“”如果全部是“而且沒有”,那麼理論上你仍然可以處理它。但不是因為runas的編寫方式。 - barlop
@barlop:別想 cmd 作為runas的論據,因為它不是。 runas的論點是 cmd /k dir \"%userprofile%\"。我現在沒有時間,但給我幾個小時,我應該能夠向你解釋一個簡單的C ++程序以及這些程序如何解釋參數。我認為會更清楚。所以, 答案必然要改變 - Default
其實我可能理解並且不清楚。我知道主要的方法和argsv。我聽說他們在第一個元素中接受了所有論證?是對的嗎?關於我提到cmd.exe,有​​一個歧義是我的意思是該行中的cmd.exe,還是寫入該行的外部cmd.exe。我在這些評論中寫的只有我提到的cmd.exe,是cmd / c dir ab我是對的 - 對於一個b-是1個參數。但我被告知(不知道是否正確)所有的Windows程序都將它們的所有args作為1個字符串,大概是argsv [0],然後自己拆分 - barlop
@Michael,如果你想要它為什麼形式..我可以問。為什麼cmd / c dir a b被解釋為cmd / c“dir a b”而對於runas,程序參數(參見runas /?)需要引號。我認為runas很容易被編碼為不想要它們。從理論上看,我看起來不應該需要它們。 - barlop