【问题标题】:PATH variable is empty when calling .cmd from powershell从 powershell 调用 .cmd 时 PATH 变量为空
【发布时间】:2017-12-01 23:47:04
【问题描述】:

如果我直接在命令提示符下运行以下行,我会看到预期的输出。

echo %PATH%
> C:\Program...

但是,如果我在.ps1 文件中的.cmd 文件中运行相同的命令,则PATH 为空。

# program.ps1
python --version
Write-Output $env:PATH
& .\command.cmd

# command.cmd
python --version
echo %PATH%

.\program.ps1
> Python 3.5.2
> C:\Program...
> 'python' is not recognized as an internal or external command
> ECHO is on.

为什么从 powershell 脚本运行命令会清除我的 PATH 变量?

编辑

上面的例子经过简化,试图找出问题的根源。问题是从批处理文件执行时找不到PATH 上的任何内容。因此,例如,我无法使用python。我更新了示例以更好地详细说明我所看到的内容。

【问题讨论】:

  • 无法在 Windows 10 上使用 PowerShell 5.1 重现。回显整个路径。尝试.ps1 文件中的echo $env:PATH 以查看那里的路径是否已经为空。 (另请注意,.cmd 的输出应包含字符串 echo - 如果 %PATH% 确实为空,则命令文件应生成 ECHO is on. 如果没有,则不会调用它。你确定你不需要.\command.cmd,指定文件路径?)
  • 您使用的是什么操作系统和 PowerShell 版本?在 W10 上使用 PS5.1 对我来说也可以正常工作。
  • 第二个。我也无法重现它。我认为问题是 command.cmd 根本没有执行。
  • 从 powershell 运行批处理文件似乎没有意义,它可以做一些 powershell 也很容易做的事情。也可以使用 Jeroen 示例的替代方法:[Environment]::GetEnvironmentVariable("Path")
  • 尝试在.ps1 中故意将路径更改为简短的路径,看看是否是长度或转义字符的某种问题。 (我对此表示怀疑,但是嘿。)另外,尝试从 PoSH 显式调用 cmd.exe /c 来运行 .cmd,而不是依赖任何隐含的机制。

标签: powershell batch-file cmd


【解决方案1】:

看起来我的 powershell 会话以某种方式搞砸了。 Powershell 有一个明确定义的$env:PATH 变量,它可以正常工作,但是command.exe 上下文中的任何东西都有一个未定义的%PATH% 变量。我仍然不明白这是怎么发生的,但是创建一个新的 powershell 会话可以解决这个问题。

【讨论】:

  • 没有command.exe。 DOS 中有command.com,Windows 中有cmd.exe
【解决方案2】:

我遇到了完全相同的问题。就我而言,原因是 Powershell 中的 $env:PATH 变量太长。从 Powerhell 调用 .cmd 时,PATH 不会被截断(正如人们所期望的那样),而是空的。

有一些docs on commandline length limit。在我的测试中,PATH 的最大长度是 8184 个字符。

打开一个新的 Powershell 会话可能有助于缓解问题(如果只有当前进程 PATH var 超过阈值,而不是系统范围的阈值)。

【讨论】:

    【解决方案3】:

    你的脚本的目的是什么?

    如果您尝试获取脚本所在的 PowerShell 的当前路径,请尝试命令“Get-Location”。它将返回当前路径

    PS C:\Windows\system32> Get-Location
    
    Path
    ----
    C:\Windows\system32
    

    如果要将其放入变量中,请执行以下操作

    PS C:\Windows\system32> $Path = (Get-Location).path
    PS C:\Windows\system32> $Path
    C:\Windows\system32
    

    【讨论】:

    • Get-Location 告诉当前工作目录可能不是 .ps1 脚本所在的位置。 $($MyInvocation.MyCommand.Source)
    • 啊,我明白了,我误解了问题的含义。是的,$MyInvocation 变量将是这里最合乎逻辑的来源。
    猜你喜欢
    • 2017-09-28
    • 2012-06-19
    • 1970-01-01
    • 2014-08-04
    • 2013-05-23
    • 1970-01-01
    • 2023-03-31
    • 2020-02-06
    • 2020-06-22
    相关资源
    最近更新 更多