从powershell调用.cmd时,PATH变量为空

时间:2017-06-28 14:28:40

标签: powershell batch-file cmd

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

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

但是,如果我在.cmd文件的.ps1文件中运行相同的命令,则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。我已经更新了示例,以更好地详细说明我所看到的内容。

3 个答案:

答案 0 :(得分:0)

看起来好像我的powershell会话搞砸了。 Powershell有一个明确定义的$env:PATH变量,它可以正常工作,但command.exe上下文中的任何内容都有一个未定义的%PATH%变量。我仍然不明白这将如何发生,但创建一个新的PowerShell会议纠正了这个问题。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:-2)

您的脚本的目的是什么?

如果您正在尝试获取脚本所针对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