我有一个批处理文件,需要传递一个包含管道和空格的参数。由于空格,在传入参数时需要将双引号附加到参数上。我需要去掉那些双引号并回显参数。通常,使用〜会让我这样做,但我认为我传入的具体参数会导致问题。如果我这样做:
[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.
那么如何删除双引号并仍然有一个可用的变量?
答案 0 :(得分:4)
您可以使用延迟扩展,因为它不关心特殊字符 唯一的问题是将参数内容放入变量中,因为它只能通过百分比扩展来传输 但在你的情况下这应该有效。
@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
答案 1 :(得分:1)
@echo off
if "%~2"=="" (
call %0 "Account|Access Level|Description" dummy
) ELSE (
setlocal ENABLEEXTENSIONS
for /F "tokens=*" %%A IN ("%~1") DO @echo.%%A
)
不完全漂亮,但它确实有效。处理特殊字符始终是批处理文件的痛苦......