PowerShell中的奇怪行为:在下标中调用Path.GetFullPath返回相对于外部脚本的路径

本文关键字:返回 GetFullPath Path 相对于 脚本 路径 调用 外部 PowerShell 下标 | 更新日期: 2023-09-27 18:24:08

这里是PowerShell新手。在编写脚本时,我注意到Path.GetFullPath()将返回相对于外部脚本目录的路径。例如:

# In your PowerShell console...
cd ~/Downloads
echo "cd ..;[IO.Path]::GetFullPath('script.ps1')" > script.ps1
powershell -ExecutionPolicy Bypass './script.ps1'

应该打印C:'Users'You'script.ps1时打印C:'Users'You'Downloads'script.ps1(注意cd ..)。

这是PowerShell中的一个错误吗?有什么方法可以绕过它?

PowerShell中的奇怪行为:在下标中调用Path.GetFullPath返回相对于外部脚本的路径

[IO.Path]::GetFullPath('script.ps1')使用进程的当前工作目录。这与powershell的CWD不同。要更改进程的CWD(以获得您期望的输出),您必须使用.NET API来更改进程CWD,而不是PS内部的cd ..

我相信这不是一个bug,而是设计出来的。设计的一个原因是PS在文件系统之外有CWD的概念。因此,您的CWD可以在注册表、wsman提供程序以及任何选择实现目录的第三方提供程序插件中。这不能在进程的CWD中镜像,因为它严格适用于文件系统。

一般来说,当你把PS概念和.NET概念混合在一起时,一切都很顺利。然而,有些地方存在阻抗失配。这是其中之一。