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

从powershell调用.cmd时,PATH变量为空,powershell,batch-file,cmd,Powershell,Batch File,Cmd,如果在命令提示符下直接运行以下行,则会看到预期的输出 echo %PATH% > C:\Program... 但是,如果从.ps1文件在.cmd文件中运行相同的命令,则路径为空 # program.ps1 python --version Write-Output $env:PATH & .\command.cmd # command.cmd python --version echo %PATH% .\program.ps1 > Python 3.5.2 > C

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

echo %PATH%
> C:\Program...
但是,如果从
.ps1
文件在
.cmd
文件中运行相同的命令,则
路径
为空

# 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
变量

编辑


对上面的示例进行了简化,以试图找到问题的根源。问题是,从批处理文件执行时,
路径上的任何内容都找不到。例如,我不能使用
python
。我已经更新了示例,以便更好地详细说明我看到的内容。

您的脚本的目的是什么

如果您试图获取脚本在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

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

我遇到了完全相同的问题。在我的例子中,原因是Powershell中的变量太长。从Powerhell调用
.cmd
时,路径不会被截断(正如人们所期望的那样),而是为空

有一些。在我的测试中,路径的最大长度是8184个字符


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

无法在Windows 10上使用Powershell 5.1进行复制。整个路径都有回声。从
.ps1
文件中尝试
echo$env:PATH
,查看路径是否已为空。(还请注意,
.cmd
的输出应包括字符串
echo
——如果
%PATH%
确实为空,则命令文件应生成
echo处于启用状态。
如果未启用,则不会调用它。是否确实不需要
\command.cmd
,指定文件路径?)您使用的操作系统和PowerShell版本是什么?在W10上使用PS5.1对我来说也很好。我也不能复制它。我认为问题在于command.cmd根本没有执行。从powershell运行批处理文件似乎毫无意义,因为它可以轻松完成powershell也可以完成的任务。Jeroen示例的另一种选择也可用:
[Environment]::GetEnvironmentVariable(“Path”)
尝试在
.ps1
中故意将路径更改为简短的路径,以查看是否存在长度或转义字符方面的某种问题。(我对此表示怀疑,但嘿。)另外,请尝试从PoSH显式调用
cmd.exe/c
,以运行
.cmd
,而不是依赖于隐式执行此操作的任何机制。Get-Location告诉当前工作目录,该目录可能不是.ps1脚本所在的位置$($MyInvocation.MyCommand.Source)啊,我明白了,我误解了问题的意思。是的,$MyInvocation变量将是这里最符合逻辑的源。没有
command.exe
。DOS中有
command.com
,Windows中有
cmd.exe