如何使用百分比变量作为用户输入命令的变量?

时间:2018-01-23 12:48:27

标签: batch-file cmd environment-variables

在批处理脚本中,是否可以使用用户输入的命令中的百分比变量(例如%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!)并显示它的值。

那么如何才能使用百分比变量?知道发生了什么导致了这个问题吗?

3 个答案:

答案 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%,这会增加另一层扩展