我想这样做:
set %1="html"
但是它不起作用,我回来了:
"html"不被识别为内部或外部命令, 可操作的程序或批处理文件。
%1
不是使用 SET 分配的变量。它表示被调用的批处理脚本(test.bat arg1
或call test.bat arg1
)或子例程(call :subroutine arg1
)的第一个参数。
如果要更改 %1 的值,请在进行调用的位置执行此操作,而不是在调用脚本/例程中执行此操作。
在某些情况下,使用线路set %1=value
。您可能有一个例程,该例程计算一个值,然后将结果存储在一个变量中,该变量的名称从第一个参数检索到例程。
但是,如果在没有参数的情况下调用例程,则该行将扩展到 set =value
,这将生成您得到的错误。
如果您正在使用 %1
参数,并且有条件地想要在脚本中"更改值",则必须将值传输到环境变量,并从该点开始使用该变量。
一个简单的例子是在参数未传递时提供默认值:
@echo off
setlocal
set "arg1=%~1"
if not defined arg1 set "arg1=default"
REM From now on you never refer to `%1` but use `%arg1%` instead.
看看这个:
@ECHO OFF
Setlocal EnableDelayedExpansion
SET 1="html"
echo %1%
echo !1!
PAUSE
使用参数 abc
执行此代码将返回
abc
html
显然,您需要Setlocal EnableDelayedExpansion
才能"覆盖"%1。但是,这实际上不会覆盖 %1,而是使其更新的值可访问。AFAIK 没有办法真正覆盖它。我能想到的只有一种解决方法:
使用"html"作为第二个参数调用文件并使用SHIFT
:
ECHO %1
SHIFT
ECHO %1
使用 params X 和 html (yourfile.bat X html) 执行此代码将打印:
十
.html