Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 带有空格、双引号和管道的批处理文件参数_Windows_Batch File - Fatal编程技术网

Windows 带有空格、双引号和管道的批处理文件参数

Windows 带有空格、双引号和管道的批处理文件参数,windows,batch-file,Windows,Batch File,我有一个批处理文件,需要传递一个包含管道和空间的参数。由于空格的原因,传入参数时需要将双引号附加到参数。我需要去掉那些双引号并回显参数。通常,使用~可以让我这样做,但我认为我传入的特定参数会导致问题。如果我这样做: [test1.bat] call test2.bat "Account|Access Level|Description" [test2.bat] echo %1 echo %~1 然后运行test1.bat,我得到以下输出: "Account|Access Level|Desc

我有一个批处理文件,需要传递一个包含管道和空间的参数。由于空格的原因,传入参数时需要将双引号附加到参数。我需要去掉那些双引号并回显参数。通常,使用~可以让我这样做,但我认为我传入的特定参数会导致问题。如果我这样做:

[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.
那么,如何删除双引号并仍然有一个可用的变量呢

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

不是很漂亮,但很管用。处理特殊字符在批处理文件中总是一件痛苦的事情…

您可以使用延迟扩展,因为它不关心特殊字符。
唯一的问题是将参数内容放入变量中,因为它只能通过百分比扩展进行传输。
但在你的情况下,这应该是可行的

@echo off
setlocal DisableDelayedExpansion
set "str=%~1"
setlocal EnableDelayedExpansion
echo !str!
备注:我先禁用延迟扩展,所以!和^未被%1的扩展修改

编辑:可以使用禁用或启用延迟扩展

setlocal DisableDelayedExpansion
setlocal EnableDelayedExpansion
如果启用,它将添加另一种扩展变量的方法(
!variable!
而不是
%variable%
),主要用于防止变量的括号块效应(如
设置/?
所述)

但是用
进行扩展!变数还阻止任何进一步解析的内容,因为延迟扩展是批处理行解析的最后阶段。
详细说明见

成功了!非常感谢你!你能告诉我为什么它有效吗?当我禁用或启用“延迟扩展”时,我在做什么?您如何将一个双引号传递到该文件中?每当我试图调用一个批处理文件引用它时,比如
\blah.cmd“asdf”“123”
echo!str输出两个双引号,而不是一个。如何将文字双引号传递到该文件中?当我尝试时(通过
\play2.cmd“a b”c“dummy
),我得到两个双引号,而不是1。