PowerShell 中的奇怪行为:在相对于外部脚本的下标 return 路径中调用 Path.GetFullPath
Strange behavior in PowerShell: Invoking Path.GetFullPath in subscripts return paths relative to the outer script
这里是 PowerShell 的新手。我在编写脚本时注意到 Path.GetFullPath()
将 return 相对于外部脚本目录的路径。例如:
# 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 中的错误吗?有哪些方法可以避免这种情况?
[IO.Path]::GetFullPath('script.ps1')
使用进程的当前工作目录。这与 powershell 的 CWD 不同。要更改进程的 CWD(以获得您期望的输出),您必须使用 .NET API 来更改进程 CWD,而不是 PS 内部的 cd ..
.
我相信这不是错误,而是设计使然。设计的原因之一是 PS 在文件系统之外具有 CWD 的概念。因此,您的 CWD 可以位于注册表、wsman 提供程序和任何选择实现目录的第 3 方提供程序插件中。这不能反映在进程的 CWD 中,因为它严格适用于文件系统。
通常情况下,当您将 PS 概念与 .NET 概念混合使用时,效果会很好。但是,有些地方存在阻抗不匹配。这是其中之一。
这里是 PowerShell 的新手。我在编写脚本时注意到 Path.GetFullPath()
将 return 相对于外部脚本目录的路径。例如:
# 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 中的错误吗?有哪些方法可以避免这种情况?
[IO.Path]::GetFullPath('script.ps1')
使用进程的当前工作目录。这与 powershell 的 CWD 不同。要更改进程的 CWD(以获得您期望的输出),您必须使用 .NET API 来更改进程 CWD,而不是 PS 内部的 cd ..
.
我相信这不是错误,而是设计使然。设计的原因之一是 PS 在文件系统之外具有 CWD 的概念。因此,您的 CWD 可以位于注册表、wsman 提供程序和任何选择实现目录的第 3 方提供程序插件中。这不能反映在进程的 CWD 中,因为它严格适用于文件系统。
通常情况下,当您将 PS 概念与 .NET 概念混合使用时,效果会很好。但是,有些地方存在阻抗不匹配。这是其中之一。