题:
有可能有一个函数接收一个参数,同时具有百分号和感叹号?
问题:
我以这种方式处于FOR /D
处理目录中:
FOR /D %%d IN ("%~1\*") DO ( CALL :process "%%~fd" )
当子目录名( %%~fd
)同时包含%
和!
(在Windows中完全合法),如C:\&!x#%
。 在子:process
读取%1
时,百分号消失。 如果我EnableDelayedExpansion ,那么感叹号呢。
我看了这篇文章 ,显然这是无法解决的。 如果延迟扩展被禁用, %
将被擦除。 如果启用延迟扩展,则!
将会。
例:
ex.bat:
@ECHO OFF SET arg="%~1" CALL :clean_echo %arg% GOTO :EOF :clean_echo SET arg="%~1" SET arg=%arg:&=^&% SET arg=%arg:|=^|% SET arg=%arg:<=^<% SET arg=%arg:>=^>% ECHO %arg:~1,-1% GOTO :EOF
如果我执行ex.bat "%!"
输出只是!
。 传递给:clean_echo
子过程时, %
会丢失。
它可以完成,你需要加倍百分数,并用一个插入符号前缀惊叹号。
但是,这个名义上的单一的咒语是失败的,不能以适当的方式解决。
正如Magoo所说,使用一个变量总是比较好,只传递变量名而不是内容。
但是在函数中你应该使用延迟扩展来扩展变量。
setlocal DisableDelayedExpansion FOR /D %%d IN ("%~1\*") DO ( set "var=%%~fd" setlocal EnableDelayedExpansion CALL :process var endlocal ) exit /b :process set "content=!%1!" echo !content! exit /B
@ECHO OFF SETLOCAL FOR /d %%a IN (*) DO (ECHO %%~fa SET "var=%%~fa" CALL :proc var ) GOTO :EOF :proc FOR /f "tokens=1*delims==" %%x IN ('set %1 2^>nul') DO IF /i "%1"=="%%x" ( ECHO %%y ) GOTO :eof
你没有说足够的关于你的应用程序,但基本上传递这样的字符串作为参数是注定要失败的。 这里有一个方法可能适用于你,虽然它不会处理以=
开头的数据(我已经看过包含=
文件名)。
这是一个贪婪的解析器小猪的游戏。 只要您的数据仍然分配给元变量,似乎很好。 真的取决于未说明 – 正是你想要做的。