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. 1つのPowerShellプロセスに複数の実行スペースを含めることができます。各ランスペースは、異なるファイルシステムの場所にcd`dできます。ただし、.NET / processの「作業ディレクトリ」は基本的にプロセスのグローバルであり、複数の作業ディレクトリ(実行スペースごとに1つ)が存在する可能性があるシナリオでは機能しません。
于 2012-06-28T15:41:03.637 に答える
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 で実行されているためです。PowerShell のディレクトリに移動しても、実際には powershell.exe の作業ディレクトリは変更されません。

見る:

2 つのディレクトリの同期に関する 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 に答える