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

时间:2014-12-27 05:29:19

标签: windows shell batch-file

问题:

是否可以让函数接收一个既有百分号又有感叹号的参数?

问题:

我以这种方式进入FOR /D处理目录:

FOR /D %%d IN ("%~1\*") DO (
    CALL :process "%%~fd"
)

当子目录名称(%%~fd)同时包含%!(在 Windows 中完全合法)时会出现问题,例如C:\&!x#%。当我在子程序%1中阅读:process时,百分号消失。如果我 EnableDelayedExpansion ,那么感叹号就会出现。

我读过this post,显然,这无法解决。如果禁用延迟扩展,则%将被删除。如果启用了延迟展开,则!将为。

示例:

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子程序时,{{1}}会丢失。

2 个答案:

答案 0 :(得分:3)

@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

你对应用程序的说法不够充分,但基本上将这些字符串作为参数传递是注定要失败的。这是一种可能适合您的方法,虽然它不会处理以=开头的数据(我已经看到包含=的文件名。)

这是一个贪吃小游戏的中间游戏。只要您的数据仍然分配给元变量,它似乎很好。真的取决于未说明的 - 正是你想用它做什么。

答案 1 :(得分:2)

可以这样做,您需要将百分比加倍并在感叹号前加上感叹号 但是,它在名称中出现了单个插入符号,并且无法以正确的方式解决。

正如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