2011-01-27 9 views
35

私はpowershellのXML機能を使用して.configファイルを変更しています。 を呼び出すXMLDocument.Saveは、完全なパス名を指定しないかぎり、何の効果もありません。XMLファイルをpowershellに保存するには完全なパスが必要です。どうして?

# 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")が機能しないのですか?

ローカルディレクトリ以外で別の場所に保存することになりましたか?

+0

$ homeのポイントは何ですか?それはそこにあるはずです –

+0

それに関する完全なソースコードの任意のソリューション? – Kiquenet

答えて

47

理由は、powershellの現在の作業ディレクトリがプロセス作業ディレクトリと同じである必要はないからです。

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

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

Resolve-Path(Resolve-Path "orders.xml")のいずれかを使用しますが、これは値を返す前に存在をチェックするため、新しいファイルを作成する際に問題となる可能性があります。 他のオプションは、取得-場所のエイリアスを使用することです:$pwd例えば ("$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"); 
+1

あなた、私の日を救った!私がしたい3つの小さなもののように。 –

22

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

+2

それはそれがあったところです。 :-) –

+9

PowerShellのSet-Location(別名cd)は、OSによって設定されている現在のディレクトリを変更しないため、通常、現在のディレクトリはPowerShellを起動したときのどこにあってもそのまま残ります。現在のディレクトリを変更する場合は、[Environment] :: CurrentDirectoryプロパティを設定できます。 – OldFart

関連する問題