批处理:具有两个扩展符号的参数

题:

有可能有一个函数接收一个参数,同时具有百分号和感叹号?

问题:

我以这种方式处于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 

你没有说足够的关于你的应用程序,但基本上传递这样的字符串作为参数是注定要失败的。 这里有一个方法可能适用于你,虽然它不会处理以=开头的数据(我已经看过包含=文件名)。

这是一个贪婪的解析器小猪的游戏。 只要您的数据仍然分配给元变量,似乎很好。 真的取决于未说明 – 正是你想要做的。