如果我在命令提示符中直接运行以下行,我会看到预期的输出。
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
。我已经更新了示例,以更好地详细说明我所看到的内容。
答案 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