2011-03-08 119 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