在批处理脚本中,是否可以使用用户输入的命令中的百分比变量(例如%PATH%
)?我正在创建一个批处理脚本,它使用用户的输入来运行某些命令,我希望用户能够在命令中使用变量,但它不起作用。当我使用SETLOCAL EnableDelayedExpansion
时,我可以使用感叹号变量,但启用或禁用它后,百分比变量不会起作用。对于不熟悉使用感叹号变量的用户(例如!PATH!
),我希望可以使用百分比变量。任何想法为什么它不起作用?
根据评论,要求提供一个例子。这是我的基本版本:
ECHO OFF
TITLE Batch Prompt
CLS
ECHO Test this code using "ECHO <command here>"
CD %USERPROFILE%
:CMD
set /P "COMMAND=>"
%COMMAND%
GOTO CMD
您可以将其复制到记事本并将其保存为批处理文件,并使用ECHO查看它如何处理变量来测试。不要尝试任何其他命令,因为在此非常基本的版本,它可能无法正常工作。
从测试中可以看出,没有显示使用百分号的任何变量(例如%HOMEDRIVE%)。但是启用延迟扩展,并使用感叹号(例如!HOMEDRIVE!)并显示它的值。
那么如何才能使用百分比变量?知道发生了什么导致了这个问题吗?
答案 0 :(得分:1)
DelayedExpansion
允许您使用感叹号变量,但它不会影响%path%
等“常规”变量的使用。因此,如果设置了DelayedExpansion
,则可以使用两者,否则只有%var%
可用。
答案 1 :(得分:1)
@echo off
set args="!literal!" "literal!"
call :label_1 %args%
call :label_2 %args%
setlocal enabledelayedexpansion
echo %args%
endlocal
echo %args%
goto :eof
:label_1
setlocal enabledelayedexpansion
echo %args%
goto :eof
:label_2
setlocal disabledelayedexpansion
echo %args%
goto :eof
如上例所示,如果用户传递诸如的参数
"!literal!" "literal!"
,然后可以将参数视为变量
具有双重惊叹的名称,可以是未定义的或者是一个值
已设置变量值。还有一个单一的惊叹号
可以删除惊叹。
因此,您可能需要在部分代码中禁用延迟扩展 在认为安全的情况下启用它,即在不处理用户参数时。
示例输出:
"" "literal"
"!literal!" "literal!"
"" "literal"
"!literal!" "literal!"
第一行和第三行显示enableddelayedexpansion
的问题。
对更新后问题的回应。
%COMMAND%
未展开,即%HOMEDRIVE%
作为字面值
用户输入。您可以使用%COMMAND%
作为参数调用标签。
在标签内部,使用扩展参数设置%COMMANDS%
。
通话后%COMMAND%
已展开%HOMEDRIVE%
。
示例:
@echo off
set /p "COMMAND=>"
call :expand_args %COMMAND%
echo testing: %COMMAND%
%COMMAND%
goto :eof
:expand_args
set COMMAND=%*
goto :eof
答案 2 :(得分:1)
将行%COMMAND%
替换为call %COMMAND%
,这会增加另一层扩展