为什么不';PowerShell中的t.NET对象是否使用当前目录?
当您使用PowerShell中的.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为什么要这样做?这种行为可以改变吗?如果无法改变,我该如何应对 我已经尝试了解析路径,但这只适用于已经存在的文件,
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的工作目录概念保持同步的原因如下:
您可以将.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是不同的;但是它并没有直接回答这个问题。一个链接到一个完整的提示函数和修复程序就好了。主旨