22

当您使用 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了,但这只适用于已经存在的文件,而且它太冗长而不能一直这样做。

4

6 回答 6

29

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

于 2013-04-30T16:59:07.890 回答
16

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

  1. PowerShell 工作目录可以位于甚至不是基于文件系统的提供程序中,例如 HKLM:\Software
  2. 单个 PowerShell 进程可以有多个运行空间。每个运行空间都可以 cd`d 进入不同的文件系统位置。但是,.NET/process“工作目录”本质上是进程的全局,不适用于可能有多个工作目录(每个运行空间一个)的场景。
于 2012-06-28T15:41:03.637 回答
5

为方便起见,我在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 工作目录)将在我的机器上运行,但不一定在其他机器上运行。

于 2018-05-14T19:20:20.017 回答
3

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

$pwd\foo.cer

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

C:\> [Environment]::CurrentDirectory

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

您可以查看 .net 使用的文件夹。

于 2012-06-28T13:56:49.147 回答
1

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

看:

关于同步两个目录的 PowerTip 文章

Channel9 论坛主题

于 2012-06-28T13:50:42.580 回答
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
}
于 2012-06-28T14:50:55.480 回答