2011-03-08 258 views
6

我有一個批處理文件需要傳遞一個參數,該參數將包含管道和空格。由於空格的原因,傳入時需要將雙引號附加到參數中。我需要去除這些雙引號並回顯參數。通常情況下,使用〜會讓我這樣做,但我認爲有關我傳入的特定參數會導致問題。如果我這樣做:帶空格,雙引號,管道的批處理文件參數

[test1.bat]

call test2.bat "Account|Access Level|Description" 

[test2.bat]

echo %1 
echo %~1 

和運行test1.bat,我得到這樣的輸出:

"Account|Access Level|Description" 
'Access' is not recognized as an internal or external command, operable program or batch file. 

那麼如何刪除雙引號並仍然有可用的變量?

回答

3

您可以使用延遲擴展,因爲它不關心特殊字符。
唯一的問題是將參數內容放入變量中,因爲它只能通過百分比擴展進行傳輸。
但在你的情況下,這應該工作。

@echo off 
setlocal DisableDelayedExpansion 
set "str=%~1" 
setlocal EnableDelayedExpansion 
echo !str! 

備註,我先禁用延遲擴展,這樣!和^不受%的膨脹改性1

編輯:延遲擴展可以禁用或

setlocal DisableDelayedExpansion 
setlocal EnableDelayedExpansion 

啓用如果啓用,它增加了延伸變量的另一種方式(!variable!代替%variable%),主要用於防止變量的括號區塊效應(在set /?中描述)。

但是!variable!的擴展也阻止了任何進一步解析的內容,因爲延遲擴展是批處理行解析的最後階段。
詳細說明如下: how does the windows command interpreter cmd exe parse scripts

+0

它工作!非常感謝!你能告訴我爲什麼它有效嗎?當我禁用或啓用「延遲擴展」時,我在做什麼? – SuperNES 2011-03-09 15:18:26

+0

@SuperNES:我編輯我的帖子來解釋一下 – jeb 2011-03-09 16:13:02

+0

你會如何通過一個雙引號?每當我嘗試調用像'。\ blah.cmd「asdf」「123」'這樣的批處理文件時,'echo!str!'輸出兩個雙引號而不是一個。 – binki 2017-03-17 17:42:27

1
@echo off 
if "%~2"=="" (
    call %0 "Account|Access Level|Description" dummy 
) ELSE (
    setlocal ENABLEEXTENSIONS 
    for /F "tokens=*" %%A IN ("%~1") DO @echo.%%A 
) 

不完全漂亮,但它的工作原理。處理特殊字符在批處理文件中總是很痛苦......

+0

你會如何通過一個字面的雙引號到這個?當我嘗試(通過'。\ play2.cmd「a b」「c」dummy')時,我得到兩個雙引號而不是1. – binki 2017-03-17 17:38:46

相關問題