簡體   English   中英

如何將轉義雙引號傳遞給批處理文件

[英]How to pass escaped double quote to batch file

我知道有類似的問題,但有一件事我在答案中找不到。 我正在嘗試將以下字符串傳遞給批處理文件:

hello " world

這只是一個論點。 這是我的批處理文件:

@echo off
@echo %1

現在如果我從命令行運行它,我得到以下結果:

>C:\file.bat "hello "" world"
"hello "" world"

>C:\file.bat "hello \" world"
"hello \"

>C:\file.bat "hello """ world"
"hello """

在所有情況下,我得到了錯誤的結果,如何逃避雙引號並正確傳遞? 或者我應該在批處理文件本身中執行任何其他轉換步驟?

由於以下兩個原因,無法將hello " world的字符串文字值作為批處理參數傳遞:

  1. 關於參數標記化,空間無法轉義。 參數始終由不帶引號的標記分隔符分隔,即使它們前面有^轉義字符。 令牌參數令牌分隔符是{space}{tab},; = ,和{0xFF} 將標記分隔符作為參數的一部分包含的唯一方法是確保引用分隔符。

  2. 在引用的字符串中逃避引用是不可能的。 引號是一個狀態機:第一個遇到的引用打開引用語義,隨后的引用將其關閉。 下一個引號再次打開它等等。如果引用關閉,那么引用文字可以轉義為^"以保持引用。但一旦引用已經開始,那么就沒有辦法逃避收盤報價:下一個報價總是引用。

因此,無論您如何添加引號和/或轉義引號,總會有一個不帶引號的空格,因此該字符串將被視為兩個參數。

您可以采用Hapax推薦策略 - 引用整個字符串,並將字符串中的任何引號文字加倍: "Hello "" world"

但是我會稍微改變並使用%~1而不是%1來刪除外部引號。 那么加倍的報價應該轉換回單引號:

@echo off
set "arg1=%~1"
set "arg1=%arg1:""="%"
echo %arg1%

但是將字符串文字作為批處理參數傳遞還有其他潛在問題。 最陰險的是插入符號加倍。 如果調用者使用CALL,則不可能將帶引號的插入符作為參數傳遞。 我不會進入問題背后的機制。 如果您想了解更多信息,請參閱https://stackoverflow.com/a/4095133/1012053 但以下說明了問題:

test.bat的

@echo %1

- 示例cmd會話 -

D:\test>test "^"
"^"

D:\test>call test "^"
"^^"

由於將字符串文字作為批處理參數傳遞的許多復雜性,高級批處理腳本中使用的最有效策略是將值存儲在環境變量中,然后將變量名稱作為參數傳遞。 然后,批處理腳本可以使用延遲擴展來獲取正確的值:

test2.bat

@echo off
setlocal enableDelayedExpansion
set "arg1=!%1!"
echo !arg1!

- 示例cmd會話 -

D:\test>set "myVar=Hello world! ^&|<>" How are you doing? !^^^&^|^<^>^"

D:\test>set myVar
myVar=Hello world! ^&|<>" How are you doing? !^&|<>

D:\test>test2 myVar
Hello world! ^&|<>" How are you doing? !^&|<>

D:\test>call test2 myVar
Hello world! ^&|<>" How are you doing? !^&|<>

保持報價的方法是將它們加倍。 然而,這通過了他們兩個。 然后,您可以處理輸入並刪除雙打。

使用file.bat "hello "" world" ,我們使用:

@echo off
set param=%1
set param=%param:""="%
echo %param%

(結果: "hello " world"

更短的版本:

@echo off
set param=%1
echo %param:""="%

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM