PSScriptRoot Sonderzeichen

L

Lynacchi

Gast
Hallo Leute,

ich hab jetzt schon google bemüht aber entweder bin ich zu doof meine Frage richtig zu definieren, oder die Frage ist so dumm, dass sie noch keiner vor mir gestellt hat.

Mein Problem ist, dass ich ein Script in PowerShell geschrieben habe, welches Dateien umbenennt. Das Script führe ich einfach im Ordner aus und gut. Jetzt habe ich aber das Problem, dass Ordner mit Sonderzeichen anscheinend verhindern, dass mein Script ordnungsgemäß ausgeführt wird. Denn am Ende passiert gar nichts.

$path = "$PSScriptRoot"
$files = Get-ChildItem -Path $path

Was müsste ich hier ändern, damit auch Ordner mit Sonderzeichen funktionieren. Oder ist dies überhaupt zu ändern?

LG
 
benutze mal bitte -literalpath anstelle von -path -> das umgeht das Problem und ist für sowas gemacht.
$path = "$PSScriptRoot"
$files = Get-ChildItem -literalpath $path
 
  • Gefällt mir
Reaktionen: Lynacchi
-literalpath funktioniert soweit weiterhin in Ordnern ohne Sonderzeichen. Aber in Ordnern mit Sonderzeichen tut sich noch immer nichts.
 
Was haben denn die Ordner für Sonderzeichen?

1652275502832.png
 
Ich habe es einfach mal mit einem ' versucht. Beispielhaft "Frederik's best of".

Was mich jetzt aber komplett verwirrt ist, dass es sowohl mit -path als auch mit -literalpath funktioniert, wenn ich den Script über die Windows PowerShell ISE ausführe. Nur wäre mir das so etwas zu umständlich. Rechtsklick und "ausführen mit PowerShell" sollte es schon sein.
 
Auch hier, in PowerShell ISE gehts aber mit "Mit PowerShell ausführen" geht nicht. Anscheinend tut es sich mit dem ' verdammt schwer. Ein ´ hingegen scheint kein Problem zu sein.
 
Schon klar, aber warum gibts keinen einfachen Weg sowas bei Dateinamen zu umgehen? Hat das keiner bei der Entwicklung von PS bedacht? bzw warum gehts eigentlich in der ISE aber nicht wenn ich das Script einfach so in PS ausführe? Ich werd mit PS einfach nicht warm, wüsste aber auch keine Alternative mit der ich mein Script umsetzen kann :(
 
Naja wenn du der Powershell direkt mal per cd in den Ordner wechseln willst, dann macht er aus einem Hochkomma noch ein zweites.

1652278492278.png


Man müsste das halt direkt raus"kommentieren"
 
Lynacchi schrieb:
Schon klar, aber warum gibts keinen einfachen Weg sowas bei Dateinamen zu umgehen? Hat das keiner bei der Entwicklung von PS bedacht? bzw warum gehts eigentlich in der ISE aber nicht wenn ich das Script einfach so in PS ausführe? Ich werd mit PS einfach nicht warm, wüsste aber auch keine Alternative mit der ich mein Script umsetzen kann :(
Nicht aufgeben, damit geht echt viel und das hilft mega :) für zu Hause nicht unbedingt, aber im Firmenumfeld ist Powershell-Wissen Gold wert
 
mae1cum77 schrieb:
Ist an der Stelle eh' der Deppenapostroph. Einfach weglassen :).
Es war einfach nur ein doofes Beispiel. Es geht dabei nicht mal um Musik sondern um Videodateien und wie die Ordner dann benannt sind, kann ich nicht beeinflussen. Immerhin wollte ich den Inhalt der Ordner etwas "aufhübschen", damit der Server die Files ordentlich zuordnen kann ;)
Ergänzung ()

_Shorty schrieb:
Nicht aufgeben, damit geht echt viel und das hilft mega :)
Naja, an dem Problem hänge ich nun aber schon etwas länger und versuch ja schon verzweifelt Hilfe zu bekommen ;)
 
  • Gefällt mir
Reaktionen: mae1cum77
Das Problem ist nicht das Script, das Problem ist die Ausführung. Das hättest du daran merken können, dass dein Script doch gar nicht ausgeführt wird.

1652281705151.png


Im Hintergrund der Quellcode meines Test-Scripts. Die hintere PowerShell ist die, die via Explorer gestartet wurde. Die davor ist eine als Terminal gestartete PowerShell

Ergo kannst du an deinem Script auch nichts optimieren. Aber du kannst es vom Terminal aus aufrufen.

Da es sich um einen Bug in Windows handelt, könntest du im Feedback Hub entsprechend ein Ticket eröffnen - falls es nicht schon eines gibt.

Und an die Sonderzeichen-Experten wie Shorty hier: Wenn man das via PowerShell am Terminal ausführt, gibt es logischerweise rein gar keine Probleme mit den Sonderzeichen. Logisch, weil gar nichts maskiert werden muss in einer Variable, die bereits den richtigen Wert hat, das Maskieren ist nur notwendig, wenn der Text interpretiert werden soll...
1652281994187.png



Und OT: So sieht der Befehl für das Ausführen in der PowerShell im alten Kontext-Menü unter Windows 11 bei mir aus (gilt fürs alte und fürs neue Kontext-Menü unter Windows 11):
Code:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'"
Registry-Key HKEY_CLASSES_ROOT\SystemFileAssociations\.ps1\Shell\Windows.PowerShell.Run\Command
Und da sieht man ganz klar das Problem, das Script (also der Paramter %1) ist eben in Apostrophe verpackt.

Edit:
Aber selbst mit passender Execution-Policy und Anpassung des Befehls in der Registry in
Code:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "%1"
führt zum selben Fehler.

Edit2:
Korrekte Policy und der Befehl in der Registry funktionieren:
Code:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-File" "%1"
Beispiel:
1652283130612.png
 
Zuletzt bearbeitet:
Das hat nix mit Sonderzeichen-Experte zu tun oder nicht, ich bin selbst darauf bei meinen Scripten gestoßen, als die Ordner [] im Dateinamen haben. Wollte einfach nur mein Wissen weitergeben ;) nix weiter
 
Der Schlüssel zum Erfolg ist hier relativ simpel. Wenn man eine Pfadangabe haben will, dann verwendet man statt "Get-ChildItem" Get-Item und FullName.
Das funktioniert dann mit -path und auch mit -LiteralPath.

Habe es vorhin getestet, sowohl in der ISE, als auch über den Kontext "Mit PowerShell ausführen" über ein .ps1-Script:

Ich habe einen Ordner auf dem Laufwerk D: mit folgendem Namen erstellt:
It's a path like this % and this §"
Die Pfadangabe lautet demnach:
D:\It's a path like this % and this §

Dann den Code in ISE eingegeben mit -Path:

PowerShell:
$path = "D:\It's a path like this % and this §"
$files = (Get-Item -Force -Path $path).FullName
$files

Mit -LiteralPath:

PowerShell:
$path = "D:\It's a path like this % and this §"
$files = (Get-Item -Force -LiteralPath $path).FullName
$files

Über das Script funktioniert alles, auch das hier mit der Pfadangabe "$PSScriptRoot":

PowerShell:
$path = "$PSScriptRoot"
$files = (Get-Item -Force -LiteralPath $path).FullName

Der Knackpunkt ist hier "Get-Item" und "FullName".
 
  • Gefällt mir
Reaktionen: Lynacchi und _Shorty
Ja, bei eckigen Klammern ist dann LiteralPath notwendig, weil eckige Klammern für Wildcards genutzt werden.
Aber wie gesagt, das Problem hier war ja nicht mal Get-ChildItem.
 
  • Gefällt mir
Reaktionen: NotNerdNotDau
NotNerdNotDau schrieb:
Über das Script funktioniert alles, auch das hier mit der Pfadangabe "$PSScriptRoot":
Ok, sorry, aber anscheinend bin ich gerade etwas schwer von Begriff. Habe mich mal an deine Änderung gewagt und so bekomm ichs am Ende gar nicht mehr zum laufen. Übersehe ich gerade was? Ich pack mal mein Script, so wie es bisher bei mir funktioniert hat hier rein.

Edit: Ja, es ist sicherlich nicht perfekt, bin ja nunmal auch kein Profi ;)

PowerShell:
$path = "$PSScriptRoot"
$files = Get-ChildItem -Path $path

function getNumberByTitle($title, $file) {
    $current = "1"
    $index = $file.BaseName.IndexOf($title)
    $length = 3

    if($index -gt -1) {
        $index += $title.Length
        $tempCurrent = $file.BaseName.Substring($index)
        if($tempCurrent.Length -lt $length) {
            $length = $tempCurrent.Length
        }

        $current = $file.BaseName.Substring($index, $length).Trim()
    }
   
    return $current
}


$seasonTitle = "Staffel"
$episodeTitle = "Folge"

foreach($file in $files) {
    if($file.Extension -ne ".mkv") {
        continue
    }

    $seasonNumber = getNumberByTitle $seasonTitle $file
    $episodeNumber = getNumberByTitle $episodeTitle $file

    $oldName = $file.BaseName
   
    $titleLength = $oldName.IndexOf($seasonTitle)
   
    if ($titleLength -lt 0) {
        $titleLength = $oldName.IndexOf($episodeTitle)
    }

    $name = $oldName.Substring(0, $titleLength).Trim()

    $newName = $name + " S"+$seasonNumber.PadLeft(2, '0')+"E"+$episodeNumber.PadLeft(2, '0')+$file.Extension

    Rename-Item -Path $file.FullName -NewName $newName
}
 
Zuletzt bearbeitet von einem Moderator:
Ich sagte doch bereits: Das Script ist nicht das Problem.
Das Problem ist die Ausführung via Explorer-Kontext-Menü.
Hast du meinen Beitrag überhaupt gelesen?

Das kannst du aber beheben, wenn du es etwas anpasst. Generell ist aber die Frage, ob es nicht klüger für dich wäre, z.B. das Senden-An-Menü zu verwenden und dem Script den Pfad, auf dem es arbeiten soll, via Paramter zu übergeben. Aber das ist deine Sache.
 
  • Gefällt mir
Reaktionen: playerthreeone
$PSScriptRoot ist der Bug, vermute ich doch mal.

Was soll das Script denn machen? Und wenn nicht schon geschehen, bitte kundig machen, exakt was $PSScriptRoot ist und was es nicht ist und im Vergleich $PWD dazu oder einfach nur eine relative Pfadangabe im Script selber.
 
Zurück
Oben