当您使用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
,但这只适用于已经存在的文件,并且它总是太冗长而无法一直进行。
答案 0 :(得分:18)
您可以将.net工作目录更改为powershell工作目录:
[Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
在此行之后,[io.path]::GetFullPath
和[IO.File]::WriteAllText
等所有.net方法都可以正常运行
答案 1 :(得分:10)
PowerShell不保持当前工作目录的.NET概念与PowerShell的工作目录概念同步的原因是:
答案 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的工作目录。
请参阅:
答案 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
}