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

时间:2015-11-25 02:33:46

标签: c# .net powershell scripting path

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\Downloads\script.ps1时,

打印C:\Users\You\script.ps1(请注意cd ..)。

这是PowerShell中的一个错误,有哪些方法可以避免这种情况?

1 个答案:

答案 0 :(得分:5)

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

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

一般情况下,当您将PS概念与.NET概念混合时,事情就会很好。然而,有些地方存在阻抗不匹配。这是其中之一。