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_FILE
C:\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?
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. –
@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