Ausführen eines PowerShell-Skripts über das Explorer-Kontextmenü für Elemente, deren Namen Et-Zeichen enthalten

Ausführen eines PowerShell-Skripts über das Explorer-Kontextmenü für Elemente, deren Namen Et-Zeichen enthalten

Ich verwende eine leicht modifizierte Version der Technik ausdiese Antwortum ein Kontextmenüelement im Windows-Datei-Explorer zu erstellen, mit dem ich ein PowerShell-Skript für bestimmte Ordner ausführen kann.

Der Befehl sieht folgendermaßen aus:

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 \"%1\" | clip" 

Das funktioniert einwandfrei, außer wenn der Ordner ein Et-Zeichen (&) im Namen hat. Dann erhalte ich die folgende Fehlermeldung (Zielordner hieß Testing & Testing):

The string starting:
At line:1 char:37
+ C:\PowerShellScript\folder_script.ps1  <<<< "E:\tmp\Testing
is missing the terminator: ".
At line:1 char:53
+ E:\Dropbox\PowerShell\namefixer.ps1 "E:\tmp\Testing  <<<<
    + CategoryInfo          : ParserError: (E:\tmp\Testing :String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString

Offensichtlich interpretiert etwas das Et-Zeichen als Sonderzeichen, aber ich weiß nicht, wie ich das beheben kann. Das Entfernen des Et-Zeichens aus dem Ordnernamen ist für mich keine praktikable Lösung.

Eine Lösung ohne Batch-Skript wäre vorzuziehen.

Ich verwende Windows 7 Enterprise (64-Bit) mit PowerShell 2.

Antwort1

Du kannst den ... benutzenWortmarkervon Powershell: --%teilt es Powershell mit, dass alles, was darauf folgt, nicht interpretiert werden soll.

Auf diese Weise würde Ihr Befehl lauten:

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 --% \"%1\" | clip" 

Sofern Ihre Dateinamen keine doppelten Anführungszeichen enthalten, sollte alles in Ordnung sein.

Dieser Marker ist neu in Powershell 3.0, stellen Sie also sicher, dass er auf dem neuesten Stand ist.

Antwort2

Sie können versuchen, Ihr PowerShell-Skript zu ändern. Und ändern Sie die Befehlszeile in eine Batchdatei …

Ihr Stapel (runner.cmd)

set ps_arg="%~1"
@cd /d %~dp0
PowerShell "folder_script.ps1 | clip"

Die zweite Zeile legt den Ordner, in dem sich die Datei runner.cmd befindet, als aktuellen Ordner fest, sodass Sie das PowerShell-Skript ohne vollständigen Pfad ausführen können. Erleichtert das Verschieben von Elementen, da Sie die Datei runner.cmd nicht bearbeiten müssen.

Und greifen Sie in Ihrem Skript folgendermaßen auf Ihren Pfad zu:

$value = $env:ps_arg -replace """",""

Die Anführungszeichen aus der Batchdatei scheinen an das PowerShell-Skript übergeben zu werden und müssen entfernt werden, daher das -replace """","". Da doppelte Anführungszeichen in Windows-Dateinamen unzulässig sind, wird hierdurch nie etwas Wichtiges entfernt.

Die Befehlszeile lautet also

cmd /K runner.cmd "%1"

Antwort3

Es handelt sich um ein Anführungszeichenproblem. Ersetzen Sie die maskierten doppelten Anführungszeichen durch maskierte einfache Anführungszeichen, sodass Ihr Befehl folgendermaßen aussieht:

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 \'%1\' | clip"

Sie verwenden zwei verschiedene Programme (cmd und Powershell) und führen drei verschiedene Codeteile aus, die Argumente annehmen können (cmd, Powershell und das .ps1-Skript).

cmd benötigt drei Argumente: /K Powershell und die Argumente für Powershell. Die Argumente für Powershell müssen aus einer Zeichenfolge bestehen, deshalb stehen sie in Anführungszeichen.

Powershell benötigt ein Argument: die Befehlszeile, die Sie ausführen möchten.

Das .ps1-Skript benötigt ein Argument: den Ordner, in dem es ausgeführt werden soll. Powershell muss den Pfad als einzelne Zeichenfolge interpretieren, daher muss er in Anführungszeichen stehen.

Wenn Sie den Befehl ausführen, startet cmd Powershell und sendet ihm die in Anführungszeichen gesetzte Zeichenfolge mit der erweiterten Variable und ohne Anführungszeichen oder Escape-Zeichen:C:\PowerShellScript\folder_script.ps1 "Testing & Testing" | clip

Die Anführungszeichen stellen sicher, dass das Skript ein statt drei Argumente erkennt.

(Ich bin nicht sicher, warum die verschiedenen Arten von Anführungszeichen zu unterschiedlichen Ergebnissen führten (soweit ich weiß, sollte das nicht der Fall sein), aber bei meinen Tests war das der Fall, also habe ich die Lösung angegeben, die auf meinem System funktioniert hat. Wenn Sie weitere Einzelheiten angeben können, kann ich möglicherweise eine Lösung finden, die auch für Sie funktioniert.)

verwandte Informationen