为什么PowerShell中的.NET对象不使用当前目录?

时间:2012-06-28 13:45:34

标签: powershell

当您使用PowerShell中的.NET对象时,它需要一个文件名,它似乎总是与C:\Windows\System32相关。

例如:

[IO.File]::WriteAllText('hello.txt', 'Hello World')

...会写C:\Windows\System32\hello.txt,而不是C:\Current\Directory\hello.txt

为什么PowerShell会这样做?这种行为可以改变吗?如果无法更改,我该如何解决?

我已经尝试Resolve-Path,但这只适用于已经存在的文件,并且它总是太冗长而无法一直进行。

6 个答案:

答案 0 :(得分:18)

您可以将.net工作目录更改为powershell工作目录:
[Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
在此行之后,[io.path]::GetFullPath[IO.File]::WriteAllText等所有.net方法都可以正常运行

答案 1 :(得分:10)

PowerShell不保持当前工作目录的.NET概念与PowerShell的工作目录概念同步的原因是:

  1. PowerShell工作目录可以在甚至不是文件系统的提供程序中 基于例如HKLM:\ Software
  2. 单个PowerShell进程可以拥有 多个运行空间。每个运行空间可以cd'd到不同的文件中 系统位置。但是,.NET /进程“工作目录”是 本质上是一个全球性的过程,不适用于 可以有多个工作目录的场景(每个运行空间一个)。

答案 2 :(得分:2)

为方便起见,我将以下内容添加到prompt函数中,以便在命令完成时运行:

# Make .NET's current directory follow PowerShell's
# current directory, if possible.
if ($PWD.Provider.Name -eq 'FileSystem') {
    [System.IO.Directory]::SetCurrentDirectory($PWD)
}

这不一定是伟大的想法,因为它意味着某些脚本(假设Win32工作目录跟踪PowerShell工作目录)将在我的机器上运行,但不一定在其他机器上运行。

答案 3 :(得分:0)

这可能是因为PowerShell在System32中运行。当你cd到PowerShell中的目录时,它实际上并没有改变powershell.exe的工作目录。

请参阅:

PowerTip article on syncing the two directories

Channel9 forum thread

答案 4 :(得分:0)

在.Net方法中使用文件名时,最佳做法是使用完全限定的路径名​​。或者使用

`$pwd\foo.cer`

如果您在powershell控制台中执行以下操作:

C:\> [Environment]::CurrentDirectory

C:\WINDOWS\system32\WindowsPowerShell\v1.0

你可以看到.net使用的文件夹。

答案 5 :(得分:0)

很久以前我遇到了同样的问题,现在我将以下内容添加到我的个人资料的开头:

# Setup user environment when running session under alternate credentials and
# logged in as a normal user.
if ((Get-PSProvider FileSystem).Home -eq "")
{
    Set-Variable HOME $env:USERPROFILE -Force
    $env:HOMEDRIVE = Split-Path $HOME -Qualifier
    $env:HOMEPATH = Split-Path $HOME -NoQualifier
    (Get-PSProvider FileSystem).Home = $HOME
    Set-Location $HOME
}