Eckige Klammern in Dateien und Powershell verweigert leider die Bearbeitung
Es gibt bereits zahlreiche Fragen und Antworten im Forum zu diesen Thema, aber ich möchte es gern nochmal aufgreifen:
Ich habe diese simple Zeile:
und möchte lediglich die Klammern richtig maskieren.
Die Dateiendungen spielen in diesen Beispielen keine Rolle.
Das funktioniert zwar:
würde aber nicht meine Frage beantworten.
Dieser Versuch bringt leider auch nichts:
auch diese nichts (hätte ja sein können):
Die Datei ist natürlich vorhanden, und das richtige Verzeichnis wurde auch ausgewählt.
Ohne Klammern funktioniert das einwandfrei.
Weiß jemand bitte wie die richtige Maskierung aussehen muss, und kann das vielleicht
mitteilen?
Ich weiß das man Klammern möglichst vermeiden soll, aber das ist eine andere Sache.
Danke.
Ich habe diese simple Zeile:
Rename-Item "[test]" -NewName "d"
und möchte lediglich die Klammern richtig maskieren.
Die Dateiendungen spielen in diesen Beispielen keine Rolle.
Das funktioniert zwar:
Rename-Item -LiteralPath Z:\3\[test].txt -NewName Z:\3\d.txt
würde aber nicht meine Frage beantworten.
Dieser Versuch bringt leider auch nichts:
$maskieren = '[test]'
$maskieren = $maskieren -replace [regex]::escape('\[');
$maskieren = $maskieren -replace [regex]::escape(']\');
-> Keine Funktion
auch diese nichts (hätte ja sein können):
Rename-Item "\[test\]" -NewName "d"
Rename-Item "`[test`]" -NewName "d"
Rename-Item "\[\test\]\" -NewName "d"
Rename-Item `[`test`]` -NewName 'd'
Rename-Item `[test`] -NewName 'd'
Rename-Item '[test]' -NewName 'd'
Die Datei ist natürlich vorhanden, und das richtige Verzeichnis wurde auch ausgewählt.
Ohne Klammern funktioniert das einwandfrei.
Weiß jemand bitte wie die richtige Maskierung aussehen muss, und kann das vielleicht
mitteilen?
Ich weiß das man Klammern möglichst vermeiden soll, aber das ist eine andere Sache.
Danke.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 618004
Url: https://administrator.de/contentid/618004
Ausgedruckt am: 22.11.2024 um 04:11 Uhr
10 Kommentare
Neuester Kommentar
In den meisten "-Path" Parametern wird sogenanntes Shell-Globbing vorgenommen und da gehören die eckigen Klammern unter anderem zu den Wildcard Patterns um z.B. einen Bereich von Ziffern/Buchstaben zu definieren [a-z] oder [0-9] usw..
Siehe dazu
https://en.m.wikipedia.org/wiki/Glob_(programming)
In deinem Fall bedeutet das [Test] das an der Position einer der Buchstaben aus der Liste T e s an dieser Stelle stehen darf.
Ein Escaping dieser (was man in der PS übrigens mit Backtick macht) geht auf der Konsole indem man doppelte Backticks verwendet
Siehe https://docs.microsoft.com/en-us/powershell/scripting/developer/cmdlet/s ...
Bei Verwendung von LiteralPath dagegen werden diese Sonderzeichen nicht vorher "geparsed" und der String so wie er ist übernommen, ohne irgendwelches Globbing.
Deswegen ist es auch guter Powershell Stil immer -LiteralPath zu verwenden sofern man vorher nicht weiß ob solche Zeichen im Pfad Verwendung finden!
Hth
Gruß w.
Siehe dazu
https://en.m.wikipedia.org/wiki/Glob_(programming)
In deinem Fall bedeutet das [Test] das an der Position einer der Buchstaben aus der Liste T e s an dieser Stelle stehen darf.
Ein Escaping dieser (was man in der PS übrigens mit Backtick macht) geht auf der Konsole indem man doppelte Backticks verwendet
"``[Test``]"
Handling Literal Characters in Wildcard Patterns
If the wildcard pattern you specify contains literal characters that should not be interpretted as wildcard characters, use the backtick character (`) as an escape character. When you specify literal characters int the PowerShell API, use a single backtick. When you specify literal characters at the PowerShell command prompt, use two backticks.
For example, the following pattern contains two brackets that must be taken literally.
When used in the PowerShell API use:
"John Smith `[*`]"
When used from the PowerShell command prompt:
"John Smith ``[*``]"
This pattern matches "John Smith [Marketing]" or "John Smith [Development]".
Bei Verwendung von LiteralPath dagegen werden diese Sonderzeichen nicht vorher "geparsed" und der String so wie er ist übernommen, ohne irgendwelches Globbing.
Deswegen ist es auch guter Powershell Stil immer -LiteralPath zu verwenden sofern man vorher nicht weiß ob solche Zeichen im Pfad Verwendung finden!
Hth
Gruß w.
Geht doch, guckst du
https://tio.run/##K8gvTy0qzkjNyfn/vyS/NDlDQT26JLW4JFavpKJEnSunmEtJFwaUuI ...
Du hast wohl einen Tippfehler in deinem Datenamen oder befindest dich im falschen Verzeichnis ...
https://tio.run/##K8gvTy0qzkjNyfn/vyS/NDlDQT26JLW4JFavpKJEnSunmEtJFwaUuI ...
Du hast wohl einen Tippfehler in deinem Datenamen oder befindest dich im falschen Verzeichnis ...
Geht auch unter Windows, hier getestet ...
Du zeigst uns ja gar nicht was tatsächlich in deinem Ordner so liegt, da kannst du uns also viel erzählen wenn der Tag lang ist 😜.
Aber wie schon gesagt bei unbekannten Variableninhalten
und den Filesystem CMDLets immer -LiteralPath verwenden! Dann brauchst du das hier erst gar nicht und fang bloß nicht mit irgendwelchen Replacements an das ist Bullshit.
Die Erklärungen dazu findest du ausführlich oben.
Du zeigst uns ja gar nicht was tatsächlich in deinem Ordner so liegt, da kannst du uns also viel erzählen wenn der Tag lang ist 😜.
Aber wie schon gesagt bei unbekannten Variableninhalten
und den Filesystem CMDLets immer -LiteralPath verwenden! Dann brauchst du das hier erst gar nicht und fang bloß nicht mit irgendwelchen Replacements an das ist Bullshit.
Die Erklärungen dazu findest du ausführlich oben.
Da ist kein Workaround sondern wir oben schon mehrfach erwähnt guter Powershell Stil und sollte man immer verwenden sofern der Parameter vorhanden ist weiß anscheinend nur kaum einer, steht aber überall ...
Und falls Ihr immer noch nicht glaubt das es auch mit der PS 5.1 geht hier bitte der Beweis das es auch ohne LiteralPath geht:
Böse.
Nö, gut so, die Verwendung von LiteralPath sollte eigentlich Standard sein.Und falls Ihr immer noch nicht glaubt das es auch mit der PS 5.1 geht hier bitte der Beweis das es auch ohne LiteralPath geht: