可以在不重新启动的情况下使用最近安装的程序提供的命令 cmd/powershell?

Possible to use commands provided by a recently installed program without restarting cmd/powershell?

我正在编写一个自动安装软件的脚本。要安装的程序之一在安装时包括其自己的命令行命令和子命令。 目标是在安装后使用程序提供的命令执行操作。

但是 运行 程序安装后我收到的命令是: “不是内部或外部命令,也不是可运行的程序或批处理文件”

如果我打开一个新的 Powershell 或 cmd window 该命令在该实例中可用。

授予脚本访问命令的最简单方法是什么?

这是因为 PATH 环境变量得到更新,但现有进程看不到该更新,除非它们专门查询注册表以获取 PATH 环境变量更新的实时值,然后在它自己的进程中更新 PATH。如果您需要继续相同的过程,解决方法是在安装程序后自行将安装位置添加到 PATH 变量中:

Note: I don't recommend updating the live value from the registry instead of the below in most cases. Other processes can modify that value, not just your own. It can introduce unnecessary risk, whereas appending only what you know should have changed is a more pragmatic approach. In addition, it adds code complexity for a case that often doesn't need to be generalized to that point.

# This will update the PATH variable for the current process
$env:PATH += ";C:\Path\To\New\Program\Folder;"

解释了问题并向您展示了如何通过手动附加新目录路径来修改 $env:PATH 变量 in-session。

虽然这是一个实用的解决方案,但它要求您知道最近安装的程序的具体目录路径。

如果您不这样做 - 或者您只是想要一个不需要您 hard-code 路径的通用解决方案 - 您可以刷新 $env:PATH 的值(PATH环境变量)来自注册表,通过 [Environment]::GetEnvironmentVariable() .NET API 方法:

$env:PATH = [Environment]::GetEnvironmentVariable('Path', 'Machine'),
            [Environment]::GetEnvironmentVariable('Path', 'User') -join ';'

这会将 $env:PATH 更新为 未来 会话将看到的相同值。
请注意 machine-level 值(目录列表)如何优先于 user-level 值,因为它在复合值中排在第一位。

注:

  • 如果您在调用上述方法之前碰巧进行了 in-session-only $env:PATH 修改,这些修改将丢失。
    如果适用,这包括您的 $PROFILE 文件所做的修改。

  • 假设,自您的会话开始以来,其他进程也可能对持久性 Path 变量定义进行了额外的修改,上面的调用也会进行修改(未来的会话也会进行) .