Wie führt man ein PowerShell-Skript über ein Konsolenfenster aus, wenn der Suchpfad Å, Ä oder Ö enthält?

4568
Samir

Wenn ich mit der rechten Maustaste auf eine script.ps1Datei klicke und "Mit PowerShell ausführen" auswähle, wird ein PS-Konsolenfenster angezeigt, und mein Skript kann aus irgendeinem Grund nicht ausgeführt werden. Ich erhalte eine Fehlermeldung, kann die Nachricht jedoch nicht wirklich lesen, da sich das Fenster unmittelbar nach dem Auftreten des Fehlers schließt.

Ich möchte also ein neues PowerShell-Konsolenfenster öffnen, zur Skriptdatei navigieren, sie ausführen und hoffentlich dieses Mal den Luxus bekommen, die dumme Fehlermeldung zu lesen. Wie führe ich das Skript dann aus dem Konsolenfenster aus?

  • Betriebssystemversion: Windows 8.0
  • PS-Version: 3.0

Einfach eintippen script.ps1oder der Vorschlag ".\script.ps1"macht einfach nichts.

a

Ich vermute, es muss also eine Art Befehl erhalten? Das Skript ist sehr einfach, es soll neue Ordner erstellen und diese durch Lesen der Export.txtDatei benennen .

$folder="C:\test"; $txtFile="C:\test\Export.txt";  get-content $txtFile | %{  if($_ -match "^(\d+) (\w+)$") { mkdir "$folder\$_"; } } 

Hinweis! Bitte beachten Sie, dass die obige Fehlermeldung (Screenshot) nicht mit der Ausführung des eigentlichen Skripts zusammenhängt. Ich kann das Skript nur ausführen, indem Sie mit der rechten Maustaste auf die Skriptdatei im Explorer klicken und "Mit PowerShell ausführen" auswählen. Der Fehler, den ich beim Ausführen erhalte, ist jedoch ein anderer als der oben gezeigte.

Aktualisieren! Siehe meinen zweiten Kommentar unten. Für Pfade wie C:\test\script.ps1es funktioniert mit arbeiten .\script.ps1. Ich brauche immer noch Hilfe beim Ausführen der PS-Skriptdatei, wenn der Pfad zur Skriptdatei unkonventionelle Buchstaben wie Å, Ä und Ö enthält.

Update - Å, Ä und Ö bricht PS

Wie gesagt, ich habe Probleme mit diesen Charakteren in PS. Deshalb dachte ich zuerst, ich würde es nicht richtig machen. Ich gebe Ihnen hier zwei Beispiele, um dies zu demonstrieren.

PS-Skript ohne Å, Ä und Ö ausführen

Das ist mein Skript.

$folder="C:\test"; $txtFile="C:\test\Export.txt";  get-content $txtFile | %{  if($_ -match "^(\d+) (\w+)$") { mkdir "$folder\$_"; } } 

Dies ist der Inhalt des Ortes, an dem ich ihn gerade teste.

PS C:\test> dir   Directory: C:\test   Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2014-02-28 09:12 3648 Export.txt -a--- 2014-02-28 10:49 162 script.ps1   PS C:\test> 

Dies ist das Ausführen des Skripts aus dem PS-Konsolenfenster.

PS C:\test> .\script   Directory: C:\test   Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2014-02-28 10:55 001 Harberget d---- 2014-02-28 10:55 004 Badstuknappen d---- 2014-02-28 10:55 005 Aspberget d---- 2014-02-28 10:55 006 Knipen d---- 2014-02-28 10:55 011 Juberget d---- 2014-02-28 10:55 012 Rangen d---- 2014-02-28 10:55 014 Grasbricka d---- 2014-02-28 10:55 018 Letafors d---- 2014-02-28 10:55 020 Rya d---- 2014-02-28 10:55 022 Bograngen d---- 2014-02-28 10:55 023 Dalby d---- 2014-02-28 10:55 029 Transtrand d---- 2014-02-28 10:55 032 Viggen d---- 2014-02-28 10:55 033 Nyskoga d---- 2014-02-28 10:55 044 Vitsand d---- 2014-02-28 10:55 059 Lekvattnet d---- 2014-02-28 10:55 064 Gustavsfors d---- 2014-02-28 10:55 066 Tyfors d---- 2014-02-28 10:55 067 Mitandersfors d---- 2014-02-28 10:55 070 Bada d---- 2014-02-28 10:55 073 Geijersholm d---- 2014-02-28 10:55 074 Liljendal d---- 2014-02-28 10:55 077 Bogen d---- 2014-02-28 10:55 079 Grinnemo d---- 2014-02-28 10:55 080 Lysvik d---- 2014-02-28 10:55 082 Uddeholm d---- 2014-02-28 10:55 085 Vitklinten d---- 2014-02-28 10:55 086 Gravendal d---- 2014-02-28 10:55 087 Magnor d---- 2014-02-28 10:55 089 Bortan d---- 2014-02-28 10:55 090 Fredros d---- 2014-02-28 10:55 095 Busken d---- 2014-02-28 10:55 101 Charlottenberg d---- 2014-02-28 10:55 102 Allstakan d---- 2014-02-28 10:55 104 Rotten d---- 2014-02-28 10:55 105 Sunne d---- 2014-02-28 10:55 106 Annefors d---- 2014-02-28 10:55 107 Munkfors d---- 2014-02-28 10:55 108 Sunnemo d---- 2014-02-28 10:55 109 Nordmarker d---- 2014-02-28 10:55 111 Silvergruva d---- 2014-02-28 10:55 113 Skillingemark d---- 2014-02-28 10:55 115 Gunnarsskog d---- 2014-02-28 10:55 116 Mangskog d---- 2014-02-28 10:55 118 Rottneros d---- 2014-02-28 10:55 123 Persberget d---- 2014-02-28 10:55 124 Hellefors d---- 2014-02-28 10:55 125 Bottnar d---- 2014-02-28 10:55 128 Ottebol d---- 2014-02-28 10:55 129 Rackstad d---- 2014-02-28 10:55 130 Gullesbyn d---- 2014-02-28 10:55 131 Emtervik d---- 2014-02-28 10:55 135 Brattfors d---- 2014-02-28 10:55 136 Filipstad d---- 2014-02-28 10:55 137 Saxhyttan d---- 2014-02-28 10:55 138 Orrkullen d---- 2014-02-28 10:55 142 Arvika d---- 2014-02-28 10:55 143 Edane d---- 2014-02-28 10:55 144 Brunsberg d---- 2014-02-28 10:55 148 Nyed d---- 2014-02-28 10:55 149 Hedenskog d---- 2014-02-28 10:55 150 Kroppa d---- 2014-02-28 10:55 151 Loka d---- 2014-02-28 10:55 152 Dalen d---- 2014-02-28 10:55 154 Karlanda d---- 2014-02-28 10:55 156 Glava d---- 2014-02-28 10:55 158 Boda d---- 2014-02-28 10:55 159 Frykerud d---- 2014-02-28 10:55 160 Frykestad d---- 2014-02-28 10:55 161 Forshaga d---- 2014-02-28 10:55 164 Storfors d---- 2014-02-28 10:55 167 Holmedal d---- 2014-02-28 10:55 169 Lenungen d---- 2014-02-28 10:55 172 Vermskog d---- 2014-02-28 10:55 173 Edsvalla d---- 2014-02-28 10:55 174 Grava d---- 2014-02-28 10:55 175 Alster d---- 2014-02-28 10:55 176 Glumserud d---- 2014-02-28 10:55 177 Kungskog d---- 2014-02-28 10:55 178 Lundsberg d---- 2014-02-28 10:55 180 Mona d---- 2014-02-28 10:55 181 Foxen d---- 2014-02-28 10:55 182 Silbodal d---- 2014-02-28 10:55 183 Sannaneknatten d---- 2014-02-28 10:55 186 Borgvik d---- 2014-02-28 10:55 187 Grums d---- 2014-02-28 10:55 188 Eriksberg d---- 2014-02-28 10:55 189 Karlstad d---- 2014-02-28 10:55 193 Alkvettern d---- 2014-02-28 10:55 194 Trankil d---- 2014-02-28 10:55 195 Blomskog d---- 2014-02-28 10:55 196 Sillerud d---- 2014-02-28 10:55 198 Gillberga d---- 2014-02-28 10:55 199 Segmon d---- 2014-02-28 10:55 200 Ed d---- 2014-02-28 10:55 204 Presterud d---- 2014-02-28 10:55 205 Kristinehamn d---- 2014-02-28 10:55 207 Salholmen d---- 2014-02-28 10:55 208 Gustavsfors d---- 2014-02-28 10:55 211 Kila d---- 2014-02-28 10:55 212 Hammar d---- 2014-02-28 10:55 215 Skallholmen d---- 2014-02-28 10:55 217 Posseberg d---- 2014-02-28 10:55 219 Degerfors d---- 2014-02-28 10:55 220 Torrskog d---- 2014-02-28 10:55 221 Suled d---- 2014-02-28 10:55 222 Svanskog d---- 2014-02-28 10:55 223 Tveta d---- 2014-02-28 10:55 224 Seffle d---- 2014-02-28 10:55 226 Kilsbyn d---- 2014-02-28 10:55 227 Visnum d---- 2014-02-28 10:55 228 Nysund d---- 2014-02-28 10:55 233 Rudskoga d---- 2014-02-28 10:55 234 Grytfors d---- 2014-02-28 10:55 237 Millesvik d---- 2014-02-28 10:55 240 Rosenborg 

Offensichtlich läuft das Skript. Es werden jedoch nur 116 Ordner aus den insgesamt 245 Ordnern erstellt, die erstellt werden sollen. Das kann mit dem Skript selbst zu tun haben. Es werden Zeilen übersprungen wie 002 Långflonund 003 Källegrafsrösweil sie die Buchstaben Å, Ä und / oder Ö enthalten. Irgendwelche Ideen? Der Punkt ist jedoch, dass das Skript wie erwartet im PS-Konsolenfenster ausgeführt wird.

Ausführen des gleichen PS-Skripts mit Å, Ä und Ö

Ich habe absichtlich ein Ä in den Ordnernamen geworfen. So testwurde in umbenannt täst. Ich habe die Skriptdatei mit diesen Änderungen aktualisiert, und dies ist jetzt mein Skript.

$folder="C:\täst"; $txtFile="C:\täst\Export.txt";  get-content $txtFile | %{  if($_ -match "^(\d+) (\w+)$") { mkdir "$folder\$_"; } } 

Im Testordner befinden sich zurzeit keine Ordner. Ich habe sie entfernt, um den Test erneut auszuführen.

PS C:\täst> dir   Directory: C:\täst   Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2014-02-28 09:12 3648 Export.txt -a--- 2014-02-28 11:04 164 script.ps1   PS C:\täst> 

Und hier läuft ich die aktualisierte Skriptdatei.

PS C:\täst> .\script.ps1 get-content : Cannot find path 'C:\täst\Export.txt' because it does not exist. At C:\täst\script.ps1:4 char:1 + get-content $txtFile | %{ + ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (C:\täst\Export.txt:String) [Get-Content], ItemNotFoun + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand  PS C:\täst> 

Der Pfad 'C: \ täst \ Export.txt' kann nicht gefunden werden, da er nicht vorhanden ist.

Wie Sie sehen, versucht es, einen Pfad zu finden, der nicht vorhanden ist. Punkt bewiesen. Charaktere Å, Ä und Ö brechen PS! Aber warum? Was mache ich so falsch? ...

3
Verwenden Sie keine Anführungszeichen, wenn Sie `. \ Script.ps1` eingeben. Es würde Ihren Befehl nur wiederholen. Ashtray vor 10 Jahren 0
`. \ Script.ps1` wird es also ausführen? Aber sagt `type". \ Script.ps1 "` und das bedeutet, die Anführungszeichen einzuschließen, nein? Samir vor 10 Jahren 0
Oh! So funktioniert es dann **. Vielen Dank! Es funktioniert einfach nicht ** mit meinem eigenen Suchpfad. Ich habe ein "\\ FILESERVER \ path \ path \ path" als "Z:" - Laufwerk angehängt. Es enthält den Brief ** Ä ** und das ist ein Grund genug für PS, nicht zu arbeiten? Es scheint diese Buchstaben überhaupt nicht zu mögen. Das obige Skript möchte nicht einmal neue Ordner erstellen, wenn der Name die Buchstaben Å, Ä und Ö enthält. Samir vor 10 Jahren 1
Ich bin mir also nicht wirklich sicher, ob das meine Frage beantwortet, irgendwie ... funktioniert es mit `. \ Dateiname.ps1`, solange der Pfad keine funky Zeichen wie ** Ä ** enthält. Samir vor 10 Jahren 0
Sie finden diesen Technet-Artikel möglicherweise hilfreich: http://technet.microsoft.com/de-de/library/ee176949.aspx wmz vor 10 Jahren 0
@Sammy Der Grund, warum das Skript einige der Ordner nicht erstellt, ist, dass ich das ursprüngliche Skript so erstellt habe, dass es nur mit den Namen übereinstimmt, die Sie zuerst angegeben haben (dh 3 Ziffern, Leerzeichen und dann ein Zeichen). In der aktualisierten Antwort auf Ihre ursprüngliche Frage finden Sie ein Muster, das allen Ihren Namen entspricht. http://superuser.com/questions/722372/how-to-create-multiple-folders-and-name-them-by-reading-lines-from-text-file/722379#722379 Martin vor 10 Jahren 0
@Martin Ja, ich kann bestätigen, dass Ihr Skript jetzt auch auf diesem Windows 8-Computer funktioniert. Aber ich bin hier etwas verwirrt ... Ich habe gestern Ihr Originalskript auf meinem Vista-Computer getestet und es hat funktioniert. Ich bin mir nicht sicher, ob es alle Ordner erstellt hat, aber es hat eine ganze Menge davon erstellt, sodass ich nicht gezählt habe. Welchen Unterschied macht es, wenn es sich um Windows Vista oder Windows 8 handelt? ... Auch ist dies zumindest teilweise ein Problem mit der Codierung oder überhaupt nicht? Siehe meine Kommentare zur Antwort von UnlimitedInfinity unten. Samir vor 10 Jahren 0
@Sammy, das Problem mit europäischen Zeichen wird durch die Kodierung Ihres Skripts in ANSI gelöst. Sie müssen ein anderes "Übereinstimmungsmuster" verwenden, um die Dateinamen aus Ihrer Eingabe zu extrahieren, wie in Martins Antwort (im anderen Beitrag). UnlimitedInfinity vor 10 Jahren 0
Martins neues Skript funktioniert. Es funktioniert jedoch von "C: \ test" und es funktioniert von "Z: \ test", aber es funktioniert nicht von "Z: \ S_Värmland \ test". Das C ist mein lokales Festplattenlaufwerk und Z ist ein Netzwerkspeicherort (`\\ FILESERVER`), der als Z-Laufwerk angehängt ist. Es sieht also so aus, als ob ich recht mit dem Suchpfadproblem habe, es mag den ** Ä ** im Suchpfad nicht? Samir vor 10 Jahren 0
@Sammy, führen Sie `type theNewScriptName` aus. Sehen Sie einen Umlaut oder zwei "seltsame" Zeichen? Sind Sie also sicher, dass Sie das Skript in ANSI gespeichert haben? UnlimitedInfinity vor 10 Jahren 0

3 Antworten auf die Frage

3
UnlimitedInfinity

Hier scheint es Ihnen gelungen zu sein, den Verzeichnisnamen mit UTF-8 (Zeichensatz) einzugeben:

$folder="C:\täst"; 

Der Umlaut wird im Skript als zwei Zeichen gespeichert. Deshalb sehen Sie es in der Fehlermeldung als zwei Zeichen:

get-content : Cannot find path 'C:\täst\Export.txt' because it does not exist. 

Genau wie hast du "absichtlich ein Ä in den Ordnernamen geworfen"? Sie müssen das als ASCII tun, nicht als UTF-8.

Zeigen Sie Ihr Skript mit dem Befehl "type" an. Ich bin mir sicher, dass Sie die UTF-Darstellung wie in der Fehlermeldung sehen werden. Ihr Editor zeigt die Umlaute wie erwartet an. Der Typbefehl zeigt die Umlaute [höchstwahrscheinlich] als zwei Zeichen wie in der Fehlermeldung an.

Stellen Sie sicher, dass Ihr Editor reines ASCII oder ANSI speichert.

Mein "Editor" war Windows Explorer. Wenn das hilft? Ich habe den Ordner im Explorer einfach von "test" in "täst" umbenannt. Das Skript wurde mit Notepad ++ mit UTF ohne Stückliste gespeichert. Samir vor 10 Jahren 0
@Sammy Verwenden Sie ANSI, nicht UTF. Ziemlich oft ** Speichern Sie niemals ein Skript in UTF. UTF für Ihre Daten, ANSI für Ihr Scripting. UnlimitedInfinity vor 10 Jahren 0
Wie stellen Sie sicher, dass in Notepad ++ "reines ASCII" verwendet wird? Ich kann nur ANSI erhalten, und wenn ich es verstehe, handelt es sich tatsächlich um eine Microsoft-Version von ASCII. Aber ich könnte mich irren. Samir vor 10 Jahren 0
@Sammy ANSI und ASCII sind so ähnlich, dass ich sie immer als gleich angesehen habe. Ich habe gerade Google gefragt und es gibt einige Unterschiede: http://www.differencebetween.net/technology/web-applications/difference-between-ansi-and-ascii/ Die Antwort hat jetzt beides. UnlimitedInfinity vor 10 Jahren 0
@Sammy Um als ANSI in Notepad ++ zu speichern, klicken Sie auf das Menü "Encoding" -> "Encode in ANSI". Martin vor 10 Jahren 1
Dies war insofern hilfreich, als ich jetzt das PS-Skript zur Erstellung von 237 Ordnern (von insgesamt 245) habe. Einige von ihnen werden noch übersprungen. Ich weiß nicht warum. Aber die Liste in UTF-8 (mit BOM) und das Skript in ANSI (ASCII) zu haben, hat geholfen. Samir vor 10 Jahren 0
Die vollständige Liste der Elemente in der Liste finden Sie unter http://pastebin.com/SNde4bBN Samir vor 10 Jahren 0
Die Elemente, die von der Liste übersprungen werden, sind solche mit einem zusätzlichen Leerzeichen, beispielsweise "021 Södra Finnskoga" im Gegensatz zu "020 Rya", das nur ein Leerzeichen nach den Ziffern enthält. Samir vor 10 Jahren 0
Das liegt am Übereinstimmungsmuster. Neues Übereinstimmungsmuster hier: http://superuser.com/questions/722372/how-to-create-multiple-folders-and-name-them-by-reading-lines-from-text-file/722379#722379 UnlimitedInfinity vor 10 Jahren 0
1
and31415

Ausführen eines PowerShell-Skripts

Angenommen, Sie verfügen über ein PowerShell-Skript, my script.ps1das in gespeichert ist C:\Some folder. Um es auszuführen, können Sie entweder:

  • Navigieren Sie zum tatsächlichen Pfad und führen Sie ihn aus:

    cd "C:\Some folder" & ".\my script.ps1" 
  • Führen Sie es aus, indem Sie den vollständigen Pfad direkt angeben:

    & "C:\Some folder\my script.ps1" 

&ist der Anrufbetreiber . Alternativ können Sie es von einer regulären Eingabeaufforderung aus starten:

powershell -ExecutionPolicy Bypass -NoLogo -NoProfile -File "C:\Some folder\my script.ps1" 

Das Skript reparieren

Ich habe das Skript so umgeschrieben, dass es zwei Argumente akzeptiert: die Eingabedatei (die als Text als UTF-8 gespeichert wird) und den Zielordner. Wenn keine Kodierung angegeben ist, wird standardmäßig ASCII verwendet.

if ($args.Count -gt 1) { $file=$args[0]; $dest=$args[1]; Get-Content $file -Encoding UTF8 | %{ md "$dest\$_" >$null; } } 

Verweise

Hey, das ist wirklich praktisch. Kannte diese Syntax nicht. Vielen Dank! Ashtray vor 10 Jahren 0
Ja, ich habe es jetzt getestet, das `" .script.ps1 "allein funktioniert nicht. Aber" & ". \ Script.ps1" "tut dies und tut`. \ Script.ps1`. Aber das tut es Helfen Sie mir nicht bei den Problemen, die ich mit den Zeichen Å, Ä und Ö habe. Warum versteht PS diese Zeichen nicht? Ich werde in Kürze ein Update zu meiner Frage mit Beispielen posten. Samir vor 10 Jahren 0
Ich habe meine Frage mit Beispielen aktualisiert. Wenn Sie Ihre Antwort erweitern und erklären können, wie ein Skript in PS ausgeführt wird, wenn der Suchpfad Nicht-ASCII-Zeichen enthält, akzeptiere ich es möglicherweise als Lösung. Oder hängt das tatsächlich mit dem Skript selbst zusammen (`get-content $ txtFile`)? Samir vor 10 Jahren 0
Sie meinen wie get get content $ txtFile | % {} `? Das gibt nur "mkdir" $ folder \ $ _ "aus,` `wiederholt 245-mal im PS-Fenster, erstellt keine Ordner. Samir vor 10 Jahren 0
Ich bemerkte, dass das Original-Skript mit Dingen wie 021 Södra Finnskoga nicht richtig funktioniert, da der Name ein Leerzeichen enthält. So oder so, das Skript wie `$ folder =" C: \ täst "haben; $ txtFile = "C: \ täst \ Export.txt"; get-content $ txtFile | % `funktioniert für mich. Was verwenden Sie zum Speichern / Bearbeiten des Skripts und der Liste? Das sieht nach einem Codierungsproblem aus. and31415 vor 10 Jahren 0
Ja. Es sieht auf jeden Fall aus wie ein Codierungsproblem. Bitte sehen Sie meine Antwort. UnlimitedInfinity vor 10 Jahren 0
@Sammy Ich habe meine Antwort aktualisiert, um zusätzliche Informationen bereitzustellen. Lassen Sie mich wissen, wenn Sie weitere Zweifel haben. and31415 vor 10 Jahren 0
-1
Infinum

Sie müssen die Datei als UTF-8 mit BOM speichern - Sie können Notepad ++ verwenden. Powershell ist defekt und kann Dateien, die UTF-8 ohne BOM sind, nicht zuverlässig lesen.

Gleiches Problem + Lösung wie oben beschrieben: https://stackoverflow.com/a/14482588/1819480