9

我在将参数传递给带有嵌套双引号的批处理函数时遇到问题。

这是一个批处理文件的示例:

@SET path_with_space="c:\test\filenamewith space.txt"
@CALL :FUNCTION blaat1, "blaat2 %path_with_space%"
@GOTO :EOF

:FUNCTION
@echo off
echo arg 1: %~1
echo arg 2: %~2
echo arg 3: %~3
GOTO :EOF

输出是:

arg 1: blaat1
arg 2: blaat2 "c:\test\filenamewith
arg 3: space.txt""

我该怎么做arg 2: blaat2 "c:\test\filenamewith space.txt"?请注意,我无法调整功能或更改%path_with_space%. 我只能控制传递给函数的内容。

4

5 回答 5

11

就像 dbenham 所说,似乎不可能在没有引号的情况下转义参数中的空格。
但是,如果您知道接收器函数如何获取参数,则有可能。
然后您可以通过转义的延迟变量传递参数,该变量不会在调用中扩展,它将仅在函数中扩展。
并且有必要将函数中的参数分配给变量,但在良好且可读的代码中可能就是这种情况。

setlocal EnableDelayedExpansion 
set path_with_space="c:\test\filenamewith space.txt"
@CALL :FUNCTION blaat1, "blaat2 ^!path_with_space^!"
GOTO :EOF

:FUNCTION
@echo off
echo arg 1: %~1
echo arg 2: %~2
echo arg 3: %~3
GOTO :EOF 

输出是:

arg 1: blaat1
arg 2: blaat2 "c:\test\filenamewith space.txt"
arg 3:

编辑:批量注入的解决方案

即使应始终禁用延迟扩展,这也有效。
但是,您现在需要了解如何在函数中扩展参数。

@echo off
set path_with_space="c:\test\filenamewith space.txt"
CALL :FUNCTION 1 2 ""^^"&call:inject:""
exit/b

:inject
set arg1=blaat1
set arg2=blaat2 %path_with_space%
set arg3=none
exit /b

:FUNCTION
@echo off
set "arg1=%~1"
set "arg2=%~2"
set "arg3=%~3"
echo arg 1: %arg1%
echo arg 2: %arg2%
echo arg 3: %arg3%
GOTO :EOF
于 2012-09-23T15:23:45.663 回答
2

我发现了这一点,但我所能做的就是将问题转移到不同的领域。

使用报价

@SET 

path_with_space="c:\test\filenamewith space.txt"

:: Remove quotes
@SET _string=###%path_with_space%###
@SET _string=%_string:"###=%
@SET _string=%_string:###"=%
@SET _string=%_string:###=%

@echo %_string%

@CALL :FUNCTION blaat1, "blaat2 %_string%"
@GOTO :EOF

:FUNCTION
@echo off
@echo arg 1: %~1
@echo arg 2: %~2
@echo arg 3: %~3

:EOF


pause
于 2012-09-23T13:20:48.980 回答
2

我不相信这是可能的。

无法转义空格以使其不被解释为参数分隔符。在参数中包含空格的唯一方法是将其括在引号中。您需要一些空间来引用,而有些则不需要,所以这是不可能的。

于 2012-09-23T13:49:20.990 回答
1

@杰布+1

@davor

为什么不简单地使用双双引号

@SET path_with_space=""c:\test\filenamewith space.txt""
@CALL :FUNCTION blaat1, "blaat2 %path_with_space%", blaat3
@GOTO :EOF

:FUNCTION
@echo off
echo arg 1: %~1
::--------------------
set arg2=%~2
set arg2=%arg2:""="%
::-------------------
echo arg 2: %arg2%
echo arg 3: %~3
GOTO :EOF 

输出是:

arg 1: blaat1
arg 2: blaat2 "c:\test\filenamewith space.txt"
arg 3: blaat3
于 2012-09-24T09:49:05.857 回答
0

如果您不想使用延迟扩展(您需要编辑 FUNCTION 来完成此操作!):

我建议您在将参数传递给FUNCTION之前删除引号(注意%path_with_space:"=%"%path_with_space%"原始示例中的对比),然后您可以将它们放回去,用带引号的版本(%%_arg_2:%path_with_space:"=%=%path_with_space%%%)替换您的路径:

@SET path_with_space="c:\test\filenamewith space.txt"
@CALL :FUNCTION blaat1, "blaat2 %path_with_space:"=%"
@GOTO :EOF

:FUNCTION
@echo off
echo arg 1: %~1
set _arg_2=%~2
call echo arg 2: %%_arg_2:%path_with_space:"=%=%path_with_space%%%
echo arg 3: %~3
GOTO :EOF

输出是:

arg 1: blaat1
arg 2: blaat2 "c:\test\filenamewith space.txt"
arg 3:

如果其他参数也包含用引号括起来的路径,则可以对所有参数都遵循相同的模式

于 2017-02-06T17:52:04.500 回答