Windows批处理功能从参数中删除特殊字符

时间:2014-06-12 04:09:07

标签: windows function batch-file special-characters

我正在创建一个Windows批处理文件,其中包含一个带有可变数量参数的函数。当我调用这个批处理文件时,我传递给它的字符串包含特殊字符%。

在调用此函数之前,我设置一个包含字符串的变量(包含特殊字符)并按如下方式调用函数:

SETLOCAL ENABLEDELAYEDEXPANSION
...

SET "MYSTRING=Hello "%%V""
ECHO My String=!MYSTRING!

CALL :BATCH_FUNCTION !MYSTRING!
GOTO :EOF

这是我的批处理函数定义:

:BATCH_FUNCTION
SET "ARGS=%*"
ECHO Arguments=!ARGS!
GOTO :EOF

我遇到的问题是%符号在功能中被剥离了。

以下是要演示的输出:

My String=Hello "%V"
Arguments=Hello "V"

有谁能告诉我如何设置函数参数或函数本身不剥离%符号?

谢谢。

2 个答案:

答案 0 :(得分:2)

问题是CALL有一轮额外的解析消耗%。有关详细信息,请参阅How does the Windows Command Interpreter (CMD.EXE) parse scripts?中的第6阶段。

一个需要对代码进行最小更改的解决方案是使用变量扩展搜索和替换来加倍CALL语句中的百分比。延迟扩展搜索和替换发生在阶段5中,然后阶段6消耗额外的百分比以恢复到原始值。请注意,在搜索和替换表达式中百分比必须加倍,因为阶段1消耗发生在阶段5中的延迟扩展之前。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET "MYSTRING=Hello "%%V""
ECHO My String=!MYSTRING!

CALL :BATCH_FUNCTION !MYSTRING:%%=%%%%!
GOTO :EOF

:BATCH_FUNCTION
SET "ARGS=%*"
ECHO Arguments=!ARGS!
GOTO :EOF

但这不是将字符串值传递给函数的最佳方法。还有其他字符会导致其他并发症。在CALL语句中传递引用的^文字没有很好的解决方案。

将任何字符串值传递给函数的最佳方法是通过引用传递,即传递变量的名称,然后使用延迟扩展来访问变量的值。但是,这对%*构造没有帮助。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET "MYSTRING=Hello "%%V""
ECHO My String=!MYSTRING!

CALL :BATCH_FUNCTION MYSTRING
GOTO :EOF

:BATCH_FUNCTION
SET "ARG1=!%1!"
ECHO ARG1=!ARG1!
GOTO :EOF

答案 1 :(得分:1)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "MYSTRING=Hello "%%V""
ECHO My String=!MYSTRING!

CALL :BATCH_FUNCTION !MYSTRING:%%=%%%%!
CALL :BATCH_FUNCTION2 MYSTRING

GOTO :EOF
:BATCH_FUNCTION
SET "ARGS=%*"
ECHO Arguments=!ARGS!
GOTO :EOF

:BATCH_FUNCTION2
FOR /f "tokens=1*delims==" %%a IN ('set %1') DO IF /i "%1"=="%%a" ECHO Arguments=%%b
GOTO :EOF

这是两种不同的方式。也没有防弹。通常,处理字符串的批处理解决方案都有漏洞。