问题:
是否可以让函数接收一个既有百分号又有感叹号的参数?
问题:
我以这种方式进入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}}会丢失。
答案 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