Fehler in PowerShell-Klassen, wenn sich das Skript in einem Ordner mit einem einfachen Anführungszeichen befindet?

437
munrobasher

Die PowerShell-Skripts meines Kunden funktionieren nicht für einen neuen Benutzer, der zufällig ein einzelnes Anführungszeichen in seinem Namen enthält. Dies bedeutet, dass sein Profilpfad "C: \ Users \ Liam'OReilly" heißt. Es scheint ein Fehler im PowerShell-Klassensystem zu sein.

Erstellen Sie einen Ordner mit dem Namen "C: \ Temp'Test" und fügen Sie Test.ps1 hinzu:

Write-Host "Test" Class MyClass {} 

Führen Sie dieses Skript aus und Sie erhalten folgende Fehlermeldung:

Der angegebene Assemblyname oder die Codebase war ungültig. (Ausnahme von HRESULT: 0x80131047) Zeile: 1 Zeichen: 1 + & 'C: \ Temp''Test \ Test..ps1' + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~ + CategoryInfo: OperationStopped: (:) [], FileLoadException + FullyQualifiedErrorId: System.IO.FileLoadException

Benennen Sie den Ordner einfach in C: \ Test um und er läuft ohne Fehler.

Hat jemand eine Problemumgehung und wie kann man diesen Fehler am besten melden?

Meine Problemumgehung besteht derzeit (da der Benutzer am Montag startet) darin, das Anführungszeichen in Office 365 aus dem Anzeigenamen zu entfernen, was nicht ideal ist.

1
Ehrlich gesagt, wäre es das Beste, das einzelne Anführungszeichen aus dem Domainnamen zu entfernen. Sie können das Anführungszeichen immer noch im Anzeigenamen beibehalten. Die einzige Änderung wäre das Verzeichnis, das auf einem mit einer Domäne verbundenen Computer erstellt wird. Andernfalls müssen Sie die Registrierung auf jedem Gerät, das mit der Domäne verbunden ist, in der sie sich anmelden, manuell ändern. [Wenn Sie den Fehler melden, melden Sie ihn dem PowerShell Core-Team und sollten in PowerShell 5 behoben werden.] (Https://github.com/powershell/powershell/issues) Ramhound vor 5 Jahren 0
Vergiss das. PowerShell 5.1 scheint die letzte (Closed Source) Version zu sein. Durch die Meldung an das PowerShell Core-Team wird es eventuell behoben. * Sie sollten jedoch überprüfen, ob die aktuelle Beta-Version von PowerShell Core dieses Problem nicht aufweist (bevor Sie es melden). * Ramhound vor 5 Jahren 0
In Office 365 / Azure AD musste ich den Anzeigenamen in "Liam OReilly" umbenennen, da dies den Namen des Profilverzeichnisses des Benutzers zu bestimmen scheint munrobasher vor 5 Jahren 0
[Problem wurde dem PowerShell Core-Team übrigens bereits gemeldet und behoben] (https://github.com/PowerShell/PowerShell/issues/6598). Ich ging weiter und markierte dies als Duplikat, da das Problem gemeldet wurde, und es verwies auf eine hier gestellte Frage. Ich gehe davon aus, dass das Problem, das Sie entdeckt haben, behoben wird, wenn das gemeldete Problem behoben wird. Ramhound vor 5 Jahren 0
Mögliches Duplikat von ["PowerShell-Fenster hier öffnen" Der Kontextmenü-Befehl des Explorer-Explorer bricht mit Ordnernamen mit Apostrophen (einfache Anführungszeichen)] (https://superuser.com/questions/1310258/open-powershell-window-here-file-file- Explorer-Kontext-Menü-Befehl-Brüche-Mit-Fol) Ramhound vor 5 Jahren 0
Obwohl sich dieser Fehler definitiv im selben Bereich befindet, ist er nicht derselbe Fehler wie oben beschrieben. Sie können das Skript mithilfe des Datei-Explorer-Inhaltsmenüs ausführen (sodass der Fehler behoben wurde). Dies ist jedoch ein anderer Fehler bei der Klassenanweisung munrobasher vor 5 Jahren 0
Dann ermutige ich Sie, das Problem zu melden, aber basierend auf dem Gelesenen ist das Verhalten, das Sie entdeckt haben, mehr oder weniger beabsichtigt. Jetzt werde ich nicht darüber nachdenken, wie die beabsichtigte Designauswahl aussehen sollte, aber es scheint, dass das Problem, das ein einzelnes Zitat in dem Verzeichnis enthält, auf eine langjährige Designentscheidung in PowerShell selbst zurückzuführen ist (und es in PowerShell 5.1 wahrscheinlich nicht behoben wird) Sie müssen also PowerShell Core verwenden, wenn es behoben ist.) Ramhound vor 5 Jahren 0

1 Antwort auf die Frage

0
harrymc

Der StackOverflow-Beitrag Wie kann ich auf Dateipfade in Powershell zugreifen, die Sonderzeichen enthalten? hat drei Lösungen für das Problem:

  1. Verwenden Sie das neue Escape-Zeichen %, um die normale Syntaxanalyse der Befehlszeile bis zum Ende der Zeile zu stoppen, um keine Anführungszeichen zu finden, nicht an einem Semikolon anzuhalten und keine PowerShell-Variablen zu erweitern. Umgebungsvariablen werden bei Verwendung der cmd.exeSyntax (zB %TEMP%) noch erweitert .

  2. Schreiben Sie den Dateinamen in eine temporäre Datei und verwenden Sie ihn von dort aus.

  3. Verwenden Sie das Backtick-Symbol (`), um dem Sonderzeichen zu entgehen. Zum Beispiel :

    $dir = "C:\folder`$name\dir" 
Leider kann nur eine Ihrer Lösungen vom Autor verwendet werden, indem das Skript in einem anderen Verzeichnis ausgeführt wird. Ohne etwas über das Skript zu wissen, ist dies möglicherweise nicht möglich. Ramhound vor 5 Jahren 0
@ Ramhound: Dies ist nicht einer der Vorschläge. Möchten Sie erweitern, warum zwei von ihnen unbrauchbar sind? harrymc vor 5 Jahren 0
Wenn das Skript in einem Ordner mit einem einzigen Anführungszeichen enthalten war, wird das Skript nicht einmal ausgeführt. Wenn Sie also eine Variable oder ein Escape-Zeichen innerhalb des Skripts verwenden, wird das Problem des Autors dadurch nicht gelöst. Ramhound vor 5 Jahren 0
@Ramhound: Das Poster kann ein PowerShell-Skript verwenden, um das Skript für einfache Anführungszeichen mit einer der oben genannten Methoden auszuführen. harrymc vor 5 Jahren 0
Nur das Ausführen aus einem anderen Ordner ist eine mögliche Lösung. Dies ist schwierig, da das Skript von einem Benutzerprofilordner aus ausgeführt wird, in dem sich das Zitat befindet. Ist möglicherweise in der Lage, das Skript in einen anderen Ordner zu kopieren, wenn es ein einzelnes Zitat findet, das jedoch sehr unordentlich ist munrobasher vor 5 Jahren 0
Ein PowerShell-Skript kann in einem beliebigen Ordner ausgeführt werden. Ihr Problem besteht darin, einen Ordnernamen in einem Format zu übergeben, das nicht als etwas anderes verstanden wird. Mein Vorschlag ist zwei Schritte: Rufen Sie ein Skript auf, das sein Argument wie oben konvertiert, und übergeben Sie es in diesem Format an das Hauptskript. harrymc vor 5 Jahren 0