2017-05-24 3 views
2

Ich versuche, PowerShell tun, eine einfache Suche und ersetzen. Im Wesentlichen hatte ich einige Support-Dateien in einem Verzeichnis mit dem gleichen Namen einer "Master" -Datei. Alle bis auf eine dieser Support-Dateien sind nicht mehr notwendig. Die "Master" -Datei hat eine Textreferenz auf den Pfad der anderen Datei. Was ich tun möchte, ist diesen Pfad in der "Master" -Datei zu ändern, um das gelöschte Verzeichnis zu entfernen.Mit PowerShell ersetzen Zeichenfolge, die + in der Zeichenfolge enthält

Zum Beispiel lassen Sie uns sagen, ich habe die Datei C:\Temp\this+that.txt habe ich C:\Temp\this+that\this+that.dat haben, die jetzt zu C:\Temp\this+that.dat verschoben wurde

C:\Temp\this+that.txt hat eine Zeile wie diese:

/temp/this+that/this+that.dat 

ich diese Linie möchte werden:

/temp/this+that.dat 

Ich habe viele dieser Dateien, die eine Batch-Datei bewegt. Alles funktioniert gut mit dem Powershell-Befehl unten für alle Dateinamen, die kein Pluszeichen + enthalten. Für diese Dateien funktioniert der folgende Anruf nicht.

powershell -Command "(gc '!CURRENT_FILE!') -replace '/!BASE_NAME!/', '/' | Set-Content '!CURRENT_FILE!'" 

Für das obige Beispiel würde CURRENT_FILEC:\Temp\this+that.txt und BASE_NAME wäre this+that

jemand mit mir helfen kann, warum dies für die Dateinamen nicht funktioniert, die ein Plus + Zeichen enthalten?

+2

Das Problem hier ist, dass Sie '! BASE_NAME!' Als regulären Ausdruck behandeln. Ich kenne mich nicht in PowerShell aus, aber [diese Antwort sieht so aus, als könnte es helfen] (https://stackoverflow.com/questions/23651862/powershell-how-to-escape-all-regex-characters-from-a -String # 23651909). Im Grunde müssen Sie alle Zeichen mit einer speziellen Regex-Bedeutung entschlüsseln, bevor Sie sie in den Ausdruck interpolieren. –

+2

@ma_il ist genau richtig. Das Zeichen "+" ist ein Sonderzeichen in RegEx, daher müssen Sie es umgehen. '" (gc '! CURRENT_FILE!') -replace [regex] :: escape ('/! BASE_NAME! /'), '/' | Set-Inhalt '! CURRENT_FILE!' " – TheMadTechnician

Antwort

2

@ma_il ist genau richtig. Das Zeichen "+" ist ein Sonderzeichen in RegEx, daher müssen Sie es umgehen.

powershell -Command "(gc '!CURRENT_FILE!') -replace [regex]::escape('/!BASE_NAME!/'), '/' | Set-Content '!CURRENT_FILE!'" 
+0

Danke! Das funktioniert. – NickB

Verwandte Themen