2016-04-07 4 views
1

私は、PowerShellスクリプトをまとめてtxtログファイルを実行し、ドメイン名/ URLを削除しようとしています。ファイル内の文字列を置き換えようとしましたが、置き換えようとしました

これまでのところ、私はファイルの置き換えを行っていますが、これを試してみると、期待通りの動作をしていません。私が入ったテキストファイルがある場合

は:DOMAIN1とintranet.contoso.com交換する

intranet.contoso.comと私のスクリプトを実行した後、いくつかのテキスト

を行うには、私が希望置きますDOMAIN1tDOMAIN1eDOMAIN1xDOMAIN1tDOMAIN1

DOMAIN1 DOMAIN1aDOMAIN1nDOMAIN1dDOMAIN1 DOMAIN1sDOMAIN1oDOMAIN1mDOMAIN1eDOMAIN1あり得ます

私はどこが間違っているのか分かりません。他の2つの答えが指摘するように私のコードは、これまでのところ、配列-の-配列はそれを修正コンマ大手を落とす,(x,y,),(foo,bar)" syntax. Use of `@または単純に混乱している

$domains = ,("mydomain.net","mydomain"),("yourdomain.net","yourdomain"),("mydomain2.net","mydomain2") 
$path = Read-Host "Please enter the full path to the directory containing the files to be sanatized" 

    $files = Get-ChildItem –Path $path *.txt 
    foreach ($file in $files) 
    { 
     for($x=0; $x -lt $domains.Count; $x++) 
     { 
      (Get-Content $file.PSPath) | 
      Foreach-Object { $_ -replace $domains[$x][0], "DOMAIN$($x+1)" } | 
      Set-Content $file.PSPath 

      (Get-Content $file.PSPath) | 
      Foreach-Object { $_ -replace $domains[$x][1], "DOMAIN$($x+1)" } | 
      Set-Content $file.PSPath 

     } 
    } 

答えて

3

私はあなたの主な問題は、あなたが$domainsを定義しているunary operatorの使用であると確信しています。あなたが最初の要素を見るなら。

PS D:\temp> $domains[0] 
mydomain.net 
mydomain 

あなたが期待していたが、問題が発生した次のステップ。 "mydomain"文字列を試してみましょう。

PS D:\temp> $domains[0][1] 

何もありません。それは奇妙です。あなたが何が起こったのか分からなければこのギザギザの配列の他の要素を見てみましょう。

PS D:\temp> $domains[0][0] 
mydomain.net 
mydomain 

このナンセンスとはなんですか?配列の最初の要素の最初の要素は別の配列です。今すぐこれを見てください:

私たちが数歩前に取り組んでいた要素があります。最初の要素が2つの要素の配列を含む配列である配列を作成しました。

テストファイルはそれがなかった道に見える理由は、最初の例は、nullになり$domains[0][1]を使用し、したがって、あなたの出力を文字間のすべてのスペースに合うようにしようとしただろうということです。

単項演算子を削除します。また

$domains = ("mydomain.net","mydomain"),("yourdomain.net","yourdomain"),("mydomain2.net","mydomain2") 

価値はあなたが一致する文字列中のメタ文字を使用して注意する必要がありますので、-replaceは正規表現演算子であることを指摘しました。たとえば、期間。静的な正規表現の方法のエスケープは、文字列が文字通り一致するように、この問題を解決できます。

$_ -replace [regex]::Escape($domains[$x][1]), "DOMAIN$($x+1)" 

また-replaceも配列演算子であることを知って、あなたの交換ロジックを向上させることができます。ループ内でこれを置き換えることができます

(Get-Content $file.PSPath) | 
Foreach-Object { $_ -replace $domains[$x][0], "DOMAIN$($x+1)" } | 
Set-Content $file.PSPath 

(Get-Content $file.PSPath) | 
Foreach-Object { $_ -replace $domains[$x][1], "DOMAIN$($x+1)" } | 
Set-Content $file.PSPath 

これでこれを置き換えることができます。

(Get-Content $file) -replace $domains[$x][0], "DOMAIN$($x+1)" -replace $domains[$x][1], "DOMAIN$($x+1)" | 
Set-Content $file 

.pspath有効では必要とされていない状態。コマンドレットGet/Set-Contentは、$fileオブジェクトのパラメータ名でパスに一致します。私はそれ以上のことを本当に助けることはできません。私は良いサンプルテキストファイルがないので、これはテストされていません。もう少しテストしてテストしてください。

+0

私はpowershellにかなり新しいですので、これは私より多くの方法で私を助けました!乾杯!! – user1865044

0

です。

また、私が読んだのと同じファイルへの書き込みは、(Get-Content $file.PSPath)の構文であっても、私にとってうまくいきません。後で名前を変更して新しいファイルに書き込むことで、より一貫した結果が得られます。

+0

これは問題ではありません。それはパイプラインの下で一連の文字列を送信するだけです。問題は '$ domains'正規表現が' $ nulls'にマッチしていることです。なぜなら、それはすべてのスペースに置き換わるのです。最初の '$ domains [0] [1]'は$ nullです。 – Matt

+0

それはC#で思考を教えてくれるでしょう。 'Get-Content'は、文字単位ではなく、行単位で分解します。そうですね、私は古い生物学的CPUをオーバークロックしてすぐに戻ってきます –

+0

完全に答えを書き換えました。マットの答えはお金の上にある。 –

1

あなたが持っている問題は、多次元配列を作成する方法だと思います。私はあなたのラインを使った時、私は非常に異なった何かを得ました。

はこれに最初の行(配列の配列)を書き換えてみてください:

$domains = @(@("mydomain.net","mydomain"),@("yourdomain.net","yourdomain"),@("mydomain2.net","mydomain2")) 
関連する問題