2017-07-12 16 views
0

私の問題は、フォルダとそのサブフォルダに保存されているINIファイルのパスを変更したいのです。PowerShellでINI編集

フォルダのパスはC:\New\Path\です。

INIファイルの例:

 
notAIniText = C:\A\Path\notAIniText 
maybeAIniText = C:\A\Path\maybeAIniText 
AIniText = C:\A\Path\AIniText 

私はPSiniに関するいくつかの他の質問を読んで私は、複数のPC上でスクリプトを使用したいので、私はちょうどIDにしたくないと私はすべてをインストールする必要はありません時間PSIni。

私が試した:

$mabyIni = "C:\New\Path" 
$AiniFile = Get-ChildItem - Path "C:\New\Path\*" -Include *.ini -Recurse 
foreach ($file in $AiniFile) { 
    Select-String -Path $file -AllMatches "C:\A\Path\" | ForEach-Opject { 
     $file -replace [regex]:Escape('C:\A\Path'), ('$mabyIni') 
    } | Set-Content $mabyIni -Include *.ini 

をしかし、これは動作しません。 Get-Contentでも試しましたが、それもうまくいきません。

どのような方法でもPSiniはありますか?

+0

iniファイルでPathを検索し、 を新しいものと置き換える必要があります。私も試してみました:$ mabyIni = "C:\新しい\パス" $ AiniFile =は、Get-ChildItemコマンドレット - パス "C:\新しい\パス\ *" -include *の.ini -recurse のForEach($ AiniFileで$ファイル) { (Get-Content $ AiniFile.PSPath)| のForEach-Opject {$ファイル-replace [正規表現]:エスケープ( 'C:\パス\')、( '$ mabyIni')} | セット内容$ mabyIni -include * .ini – Mkey

+0

質問を更新してコメントを投稿しないでください。あなたのコメントのコードは本当に読みにくいです。それにかかわらず、私はあなたのコメントにコードの問題を見て、それがうまくいかなかった理由について答えを書いてみましょう。 – TheMadTechnician

答えて

2

コメントのコードは近いですが、構文上の問題がいくつかあります。それは強いから始まります:

$mabyIni = "C:\New\Path" 
$AiniFile = Get-ChildItem - Path "C:\New\Path*" -include *.ini -recurse 
ForEach($file in $AiniFile) { 

これまでのところ、とても良いです。新しいパスを定義すると、古いパスに.iniファイルのリストが表示され、それらのファイルをループします。これまでのところ、これはすべて良いコードです。それから、物事は迷い始めます。

私は疑問に文字列を置換、あなたはそれぞれの.iniファイルの内容を取得しようとしていることを確認した後、これで新しいパスにファイルを出力

(Get-Content $AiniFile.PSPath) | ForEach-Object { 
     $file -replace [regex]:Escape('C:\A\Path'),('$mabyIni') 
    }| Set-Content $mabyIni -include *.ini 

残念ながら、あなたが使用しています間違った変数を追加し、追加のForEachループを追加します。 Get-Content行から始めましょう。スクリプトのこの時点で、ファイルをループしており、現在の各ファイルは$fileで表されています。だからあなたが実際に内容を取得したいのは$fileであり、$AiniFile.PSPathではありません。

(Get-Content $file) 

[OK]をクリックすると、そのファイルの内容が文字列の配列として取得されます。さて、私はあなたが認識していないと推測していますが、-Replace演算子は文字列の配列に作用します。完璧な、私たちはちょうど弦の配列を得たことが起こる! Get-Contentコマンドはカッコで囲まれているので、最初に完了します。ちょうどその直後の-Replaceコマンドをタックすることができます。

(Get-Content $file) -replace [regex]:Escape('C:\A\Path'),$mabyIni 

あなたが持っていた-replaceコマンドはスーパークローズでした!実際、そこに[regex]::escape()を使用するための小道具を提供しなければなりません。それはまったくプロの動きで、うまくいった!唯一の問題は、置換文字列がカッコで囲まれている必要はなく、一重引用符で囲まれているため文字列が展開されず、.iniファイルのすべてに次のような行が含まれているということです:

AIniText = $mabyIni\AIniText 

あなたは私が推測しているものではありませんので、かっこを取り除きました(何も傷つけていませんでしたが、どちらも助けていないので、清潔さとシンプルさのために取り除きました)。一重引用符'も同様です。実際には、その変数に格納されている文字列が必要です。

はだから今我々は、ファイルをループの内容を読んで、新しいパスで古いパスを交換している、残っているすべての出力に新しい.iniファイルです。既に配置されているように見えるので、ファイルの既存のパスを使用して、更新されたデータにコンテンツを設定します。

(Get-Content $file) -replace [regex]:Escape('C:\A\Path'),$mabyIni | Set-Content -Path $File.FullName 

OK、完了! ForEachループを閉じて実行するだけです。

$mabyIni = "C:\New\Path" 
$AiniFile = Get-ChildItem - Path "C:\New\Path*" -include *.ini -recurse 
ForEach($file in $AiniFile) { 
    (Get-Content $file) -replace [regex]:Escape('C:\A\Path'),$mabyIni | Set-Content -Path $File.FullName 
} 
関連する問題