2016-04-07 6 views
1

Ich versuche, ein PowerShell-Skript zusammenzustellen, um txt-Protokolldateien auszuführen und Domänennamen/URLs zu entfernen.Versuchen, Zeichenfolgen in einer Datei zu ersetzen, aber es ersetzt zu viel

Bis jetzt mache ich nur einen Fund ersetzen auf den Dateien, aber wenn ich es versuche, funktioniert es nicht so, wie ich z.

wenn ich eine Textdatei enthält:

intranet.contoso.com und einen Text

nach meinem Skript läuft mit DOMAIN1 ersetzen intranet.contoso.com das löschte ich würde erhalten ist

DOMAIN1 DOMAIN1aDOMAIN1nDOMAIN1dDOMAIN1 DOMAIN1sDOMAIN1oDOMAIN1mDOMAIN1eDOMAIN1 DOMAIN1tDOMAIN1eDOMAIN1xDOMAIN1tDOMAIN1

Also ich bin mir nicht sicher, wo ich falsch liege. Mein Code bisher

$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 

     } 
    } 

Antwort

3

Ich bin sicher, dass Ihr Hauptproblem ist die Verwendung der unary operator wenn Sie $domains definieren. Wenn Sie Ihr erstes Element betrachten.

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

Was Sie erwartet hätten, aber es ist der nächste Schritt, wo das Problem auftritt. Versuchen wir mal, die "mydomain" Zeichenfolge zu erhalten

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

Nichts? Das ist merkwürdig. Nein, nicht wirklich, wenn du weißt, was passiert ist. Schauen wir uns das andere Element dieses gezackten Arrays an.

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

Was ist das für ein Unsinn? Das erste Element des ersten Elements Ihres Arrays ist ein anderes Array. Jetzt sieh dir das an:

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

Da ist das Element, das wir vor ein paar Schritten haben wollten. Sie haben ein Array erstellt, bei dem das erste Element ein Array mit einem Array aus zwei Elementen war.

Der Grund, warum Ihre Testdatei so aussieht, ist, dass das erste Beispiel versucht hätte, $domains[0][1] zu verwenden, das null wäre und jedem Leerzeichen zwischen Zeichen entspricht, also Ihrer Ausgabe.

Einfach den unären Bediener entfernen.

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

auch erwähnenswert, dass -replace ein Operator regex ist, so dass Sie Meta-Zeichen in Ihrem passenden Saiten vorsichtig mit sein müssen. Zeitraum zum Beispiel. Die Methode der statischen Regex-Methode kann dieses Problem lösen, um sicherzustellen, dass Ihre Strings wörtlich zusammenpassen.

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

Sie können auch Sie Ersetzlogik verbessern zu wissen, dass -replace ist auch ein Array-Operator. So können Sie innerhalb Ihrer Schleife diese

damit ersetzen.

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

.pspath während gültig ist nicht erforderlich. Die Cmdlets Get/Set-Content stimmen den Pfad nach Parameternamen aus dem Objekt $file überein. Mehr kann ich nicht wirklich helfen. Dies wird nicht getestet, da ich keine guten Beispieltextdateien zur Hand habe. Testen und testen Sie einige mehr, um sicher zu sein.

+0

Ich bin ziemlich neu in Powershell, das hat mir in mehr als einer Hinsicht geholfen! Prost!! – user1865044

0

ist wie die beiden anderen Antworten darauf hin, das Array-of-Arrays ist immer verwirrt mit der ,(x,y,),(foo,bar)" syntax. Use of @ `oder einfach die führende dropping Komma, das behebt.

Ich habe auch festgestellt, dass das Schreiben in die gleiche Datei, wie Sie gerade lesen, nicht gut für mich funktioniert, auch mit der (Get-Content $file.PSPath) Syntax. Ich erhalte konsistentere Ergebnisse, indem ich in eine neue Datei schreibe und später umbenenne.

+0

Dies ist nicht das Problem. Das sollte nur ein Array von Strings in die Pipeline schicken. Das Problem ist "$ domains", die Regex passt zu "$ nulls", daher ersetzt sie jeden Platz. Die erste $ domains [0] [1] 'ist $ null. – Matt

+0

Das wird mich lehren, in C# zu denken. 'Get-Content' zerlegt zeilenweise, nicht zeichenweise. Richtig, ich werde die alte biologische CPU übertakten und bald wieder zurückkommen –

+0

Antwort komplett umgeschrieben. Matts Antwort ist jedoch auf das Geld. –

1

Ich denke, das Problem, das Sie haben, ist die Art, wie Sie Ihr multidimensionales Array erstellen. Als ich deine Leitung benutzt habe, habe ich etwas ganz anderes bekommen.

versuchen, die erste Zeile dieses (ein Array von Arrays) Umschreiben:

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