命令提示符中禁用的扩展有哪些变化?

What disabled extensions change in command prompt?

使用 cmd /e:off 或使用 setlocal disableExtensions(在批处理文件中)启动命令提示符或通过注册表值 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions(通过将值设置为 0)排除它们的功能称为“扩展”的功能已禁用(默认打开)。

这会导致哪些变化?

关闭扩展会影响一些 built-in 环境变量和命令提示符命令的一些内部变量。我从未见过 non-working 变量的完整列表,尽管内部命令或多或少都有很好的记录 - 但从未放在一起列表中。

我。我将从变量:

开始

%CD% 无效。但令人惊讶的是 %__CD__% 尽管它在末尾设置了额外的反斜杠,但仍然有效。

%CMDEXTVERSION% - 在某种程度上合乎逻辑,因为命令提示符仅减少到其早期版本

%CMDCMDLINE% - 可以使用一些外部工具检索命令行,这些工具将为您提供有关当前 PID 的信息。

%ERRORLEVEL% - 作为替代 %=ExitCode% 可以使用。另外 %=ExitCodeAscii% 如果退出代码高于 32。IF ERRORLEVEL 也仍然有效。

%DATE%%TIME% - 虽然在禁用扩展模式下你不能将当前日期分配给变量,但至少有很多方法可以 display it .

%RANDOM%

%HighestNumaNodeNumber% - 这对我来说是最大的惊喜,因为这个变量是在 Windows 的较新版本中引入的,当时添加了对多核处理器的支持。它与仍在工作的 START 命令的 /NODE 开关高度相关。

二.命令:

TAB 不再是命令提示符中的自动完成文件 names.Only。

通过扩展名启动文件 - 在禁用扩展名模式下,cmd 将不会考虑 HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts//HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ext\OpenWithList 并且只会直接启动“程序” - 即[中描述的扩展名=28=]变量。

变量操作 - 替换和子字符串不适用于禁用的扩展。这意味着只有在禁用扩展的情况下,您才能打印 %=::% 的值 - 仅在命令提示符未以 admin privileges.

启动时定义的未记录变量

ASSOCFTYPE - 在禁用的扩展下不可用 - 与此处的第一点相关。

CALL - 不再能够调用标签,但不再支持其他 scripts.Argument 修饰符(也在 FOR 命令中) - %~0%~dp0, %~n0 将不再有效。只能通过 %0,%1 ..

进行普通访问

COLOR - 不再可用。虽然可以使用 other scripts.

更改颜色

IF - /我不工作。三字母比较运算符(可用于整数比较)不可用 - 仅 ==。 CMDEXTVERSION 不是选项的一部分,也不是 DEFINED 的一部分。

EXIT - Exit /b 有效,但在尝试查找 :EOF 标签时打印一条错误消息。在批处理文件中无法观察到打印错误 'officially' documented.Only。

FOR - 减少到只有基本的 for 循环 - 附加开关 /F 、 /D 、 /R 、 /L 不可用。令牌修饰符将不再以类似 CALL 参数的方式工作。

SHIFT - /N 开关不起作用,尽管没有 'officially' 记录。

GOTO - :EOF 标签不再可用。

SET - 开关 /P 和 /A 不再起作用。不接受双引号作为命令的一部分(例如 set "variable=value" 将导致错误)。不再可能列出以字符串开头的变量(例如 set path 会导致错误)。只能简单地设置一个变量值。

PUSHD - 不再将临时驱动器映射到 UNC 路径,并且 POPD 不会删除此类驱动器。没有正式记录。

PROMPT - 不支持$+$M特殊代码

HELP 命令值得一提,因为它不会检测扩展是打开还是关闭,并且会在扩展可用时打印帮助消息。

因为 COLORASSOCFTYPE (并且 IF DEFINED 不工作)是唯一关闭禁用扩展的命令是最好的选择之一检查它们是否已启用(尽管 COLOR 会更改配色方案)。 但是如果没有帮助消息,它们的输出会太大,而且帮助消息也不会那么小——这意味着即使重定向到 null 也会减慢检查速度。

最终这也可用于检测扩展是否已启用:

call ::eof >nul 2>&1 && (
    echo extensions are enabled
)||(
    echo extensions are disabled
)

或者将 assoc 或 ftype 与默认可用的扩展一起使用:

assoc .bat >nul 2>&1 && (
    echo extensions are enabled
)||(
    echo extensions are disabled
)

使用 ftype:

ftype batfile >nul 2>&1 && (
    echo extensions are enabled
)||(
    echo extensions are disabled
)