为什么不';PowerShell中的t.NET对象是否使用当前目录?

为什么不';PowerShell中的t.NET对象是否使用当前目录?,powershell,Powershell,当您使用PowerShell中的.NET对象并使用文件名时,它似乎总是相对于C:\Windows\System32 例如: [IO.File]::WriteAllText('hello.txt', 'Hello World') …将写入C:\Windows\System32\hello.txt,而不是C:\Current\Directory\hello.txt PowerShell为什么要这样做?这种行为可以改变吗?如果无法改变,我该如何应对 我已经尝试了解析路径,但这只适用于已经存在的文件,

当您使用PowerShell中的.NET对象并使用文件名时,它似乎总是相对于
C:\Windows\System32

例如:

[IO.File]::WriteAllText('hello.txt', 'Hello World')
…将写入
C:\Windows\System32\hello.txt
,而不是
C:\Current\Directory\hello.txt

PowerShell为什么要这样做?这种行为可以改变吗?如果无法改变,我该如何应对


我已经尝试了解析路径,但这只适用于已经存在的文件,而且它太冗长,无法一直执行。

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

见:


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

$pwd\foo.cer
如果从以下位置在powershell控制台中执行此操作:

C:\> [Environment]::CurrentDirectory

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

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

我很久以前遇到过相同的问题,现在我在配置文件的开头添加了以下内容:

# 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
}

PowerShell没有将当前工作目录的.NET概念与PowerShell的工作目录概念保持同步的原因如下:

  • PowerShell工作目录可以位于甚至不是文件系统的提供程序中 基于例如HKLM:\软件
  • 单个PowerShell进程可以具有 多个运行空间。可以将每个运行空间cd`d刻录到不同的文件中 系统位置。但是.NET/process“工作目录”是 基本上是一个全球性的过程,不会工作的 可以有多个工作目录(每个运行空间一个)的场景

  • 您可以将.net工作目录更改为powershell工作目录:
    [Environment]::CurrentDirectory=(获取位置-PSProvider文件系统)。ProviderPath


    在这一行之后,所有.net方法(如
    [io.path]::GetFullPath
    [io.File]::WriteAllText
    )都可以正常工作。为了方便起见,我在我的
    提示符
    函数中添加了以下内容,以便在命令完成时运行:

    # 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工作目录)将在我的机器上工作,但不一定在其他机器上工作。

    结果表明,这是的副本,但因为我运行的是提升版,所以它不是$HOME.Yep,这样就可以了——不过如果你没有被提升,而且你确实提升了
    cd$folder
    ,你就可以在
    $HOME
    上操作了。但基本上这就是为什么它不尊重$PWD的原因-因为该代码实际上是在向Windows请求进程工作目录,但是$PWD变量是一个PowerShell工件,而不是Windows工件。这在脚本中已经足够公平了。在命令行上变老很快,这很公平。正常的PowerShell进程是否可以有多个运行空间?@RogerLipscombe PowerShell.exe使用多个运行空间不是很常见,但PowerShell引擎提供了这一功能。其他主机(如PowerShell_ISE和PowerGUI)利用单个进程中的多个运行空间。启动ISE,按Ctrl+T(新powershell选项卡)并在每个选项卡中运行$pid,然后运行$ExecutionContext.Host.Runspace.InstanceId。注意,进程id是相同的,但运行空间id是不同的;但是它并没有直接回答这个问题。一个链接到一个完整的提示函数和修复程序就好了。主旨