从PowerShell调用批处理时缺少环境变量(路径)?
我目前正在对无人值守安装的特殊软件进行故障排除。我把问题缩小到缺少一个环境变量上,现在我非常困惑,因为我不知道为什么缺少它 我可以这样复制这个问题: 我有一个名为从PowerShell调用批处理时缺少环境变量(路径)?,powershell,batch-file,Powershell,Batch File,我目前正在对无人值守安装的特殊软件进行故障排除。我把问题缩小到缺少一个环境变量上,现在我非常困惑,因为我不知道为什么缺少它 我可以这样复制这个问题: 我有一个名为batch.cmd的批处理文件。此文件包含以下代码: SET Pause SET命令列出了环境变量 我从PowerShell中调用此脚本,如下所示: $Status = Start-Process -FilePath "C:\...\Batch.cmd" -PassThru -Wait 我也试着这样称呼它: & C:\...
batch.cmd
的批处理文件。此文件包含以下代码:
SET
Pause
SET
命令列出了环境变量
我从PowerShell中调用此脚本,如下所示:
$Status = Start-Process -FilePath "C:\...\Batch.cmd" -PassThru -Wait
我也试着这样称呼它:
& C:\...\Batch.cmd
因此,与直接运行批处理脚本相比,PATH变量中缺少2个文件夹路径。请看屏幕截图:
如您所见,如果直接调用脚本,路径变量包含更多条目
条目本身不是由我设置的。它们必须由安装程序在早期安装步骤中创建
我在设置环境变量方面没有太多经验,我不知道是什么,为什么会这样
有人知道发生了什么事吗
更新#1:
我还没有一个干净的解决办法
更多详情:
我正在创建一个无人参与的软件安装。第一步调用设置。似乎设置例程将两个文件夹路径添加到环境变量PATH
在第二步中,我调用了一个批处理脚本,该脚本需要PATH变量中的这两个文件夹路径,但它失败了,因为它们不在那里
我尝试在PowerShell中重新加载变量,然后使用以下行调用批处理:
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
它似乎适用于PS环境,但批处理没有变化。
第二次调用脚本时,它会工作。它在重新启动后也能工作
更新#2:
每个流程都有自己的环境变量列表。每次创建进程时,Windows都会将新进程的运行进程的当前环境变量列表复制到单独的内存区域中 任何子进程都不能修改其父进程的环境变量,父进程也不能修改其子进程之一的环境变量。如果这是可能的,那就意味着任何进程都可以操纵任何其他进程的工作记忆,这肯定是不好的 通过在命令提示窗口中执行以下操作,可以很容易地看到环境变量管理:
title First CMD
set PATH
set PATH
start "Third CMD"
set PATH
set PATH=%SystemRoot%\System32
sort /?
第一行将命令处理窗口的窗口标题更改为first CMD
第二个命令列出以PATH
开头的所有环境变量及其值。这通常意味着环境变量PATH
和PATHEXT
,其值与当前正在运行的命令进程的环境变量列表中的值相同
set "PATH=%PATH%;%USERPROFILE%\Desktop"
start "Second CMD"
第一行将桌面目录附加到当前命令进程的路径。第二行将再打开一个命令提示窗口
带有窗口标题第二个CMD
。第二个命令进程获取当前命令进程的所有环境变量的副本
set "PATH=%PATH%;%USERPROFILE%\Desktop"
start "Second CMD"
在第二个命令提示窗口中运行:
title First CMD
set PATH
set PATH
start "Third CMD"
set PATH
set PATH=%SystemRoot%\System32
sort /?
输出是PATHEXT
和PATH
,其中包含桌面目录的末尾。因此,这里已经可以看到,新的命令进程是使用与启动第二个命令进程时为第一个命令进程定义的相同的环境变量创建的,而不是存储在Windows注册表中并在Windows的高级系统设置中查看环境变量时显示的环境变量
切换到第一个命令提示符窗口并执行:
set PATH=
sort /?
结果是错误消息:
sort未被识别为内部或外部命令,可操作的程序或批处理文件 Windows命令解释器在此命令进程中找不到目录
%SystemRoot%\System32
中的sort.exe
,因为此命令进程中不再存在本地路径
,其中包含搜索可执行文件和脚本的所有目录路径目录碰巧是%SystemRoot%\System32
在第一个命令提示窗口中运行:
title First CMD
set PATH
set PATH
start "Third CMD"
set PATH
set PATH=%SystemRoot%\System32
sort /?
在打开的第三个命令提示窗口中运行:
title First CMD
set PATH
set PATH
start "Third CMD"
set PATH
set PATH=%SystemRoot%\System32
sort /?
列出的仅是带有其值的路径文本<代码>路径不再在第一个命令提示窗口中定义,因此在第三个命令提示窗口中也不存在
在第三个命令提示窗口中运行:
title First CMD
set PATH
set PATH
start "Third CMD"
set PATH
set PATH=%SystemRoot%\System32
sort /?
外部命令的帮助显示为Windows命令解释器在第三个命令过程中可以找到可执行文件,因为使用包含SORT.exe
的目录路径再次定义了localPATH
切换到第二个命令提示符窗口并运行:
sort /?
sort /?
外部命令排序的帮助也会显示在第二个命令提示窗口中,因为localPATH
在启动时仍然具有所有目录路径,包括末尾的桌面文件夹
切换到第一个命令提示符窗口并运行:
sort /?
sort /?
仍然会显示错误消息,如在第一个命令提示窗口中所示。删除之前的错误消息后,路径仍然未定义
因此,现在有3个命令进程正在运行
路径
带有未存储在Windows注册表中的其他桌面文件夹路径
很可能只有C:\Windows\System32
作为唯一的文件夹路径路径