web-dev-qa-db-ja.com

PowerShellでXMLファイルを保存するには、完全なパスが必要です。どうして?

PowershellのXML機能を使用して.configファイルを変更しています。呼び出し中 XMLDocument.Save 完全なパス名を指定しない限り、効果はありません。

# Open the xml file
$config = [xml](get-content web.config)
#
# modify the XML
$config.SelectNodes("./configuration/connectionStrings/add[@name='LocalSqlServer']") | % { $connNode = $_ }
$connNode.connectionString = $connNode.connectionString -replace '^(.*)Server=[^;]+(.*)$', '$1Server=192.168.5.2$2'
#
#
# Now I save it again
#
# This doesn't save it!
$config.Save("web.config");
# However, this works
$config.Save("{0}\\web.config" -f (get-location));

なぜ$ config.Save( "web.config")が機能しないのですか?

ローカルディレクトリ以外の場所に保存しましたか?

46
Andrew Shepherd

その理由は、powershellの現在の作業ディレクトリがプロセスの作業ディレクトリと必ずしも同じではないためです。

これは、Powershellの作業指示(Get-Location)が、レジストリや証明書などのさまざまなファイルシステムプロバイダーを利用できるためです。また、powershellは複数の実行スペースを持つことができるため、それぞれが独自の現在の作業ディレクトリを持つことができます。

これには2つの回避策があります。

1つはResolve-Path(Resolve-Path "orders.xml")を使用することです。ただし、これは値を返す前に存在を確認します。したがって、新しいファイルの作成では、これが問題になる可能性があります。もう1つのオプションは、get-locationのエイリアスを使用することです。たとえば、$pwd for ("$pwd\orders.xml")

したがって、あなたの例では、行2を次のように変更することができます

$config = [xml](get-content (Resolve-Path "web.config"))

または

$config = [xml](get-content "$pwd\web.config")

そして、12行目

$config.Save((Resolve-Path "web.config"));

または

$config.Save("$pwd\web.config");
64
James

現在の作業ディレクトリに移動しなかった場合は、$ homeを確認します。

25
mjolinor