Fehler Meldung wegen PowerShell Befehl in Batch Skript. Wo ist der Fehler?
Ich muss für mein neues Batch Skript ein Feature einbauen welches für eine vorhandene .exe Datei eine Verknüpfung auf dem Desktop erstellt. Hab also recherchiert und das hier gefunden:
powershell "$s=(New-Object -COM WScript.Shell).CreateShortcut('%userprofile%\Desktop\mylink.lnk'); $s.TargetPath='C:\Path\to\your.exe'; $s.Save()"
Hab dann die Pfade durch meine eigenen ersetzt, bekomme nun allerdings immer diese Fehler Meldung:
Da ich nicht verstehe was genau er will: Leute die Ahnung haben, bitte helft mir. :)
2 Antworten
Blos gut das Du die Fehlermeldung gepostet hast, sonst hätte ich das Problem nicht erkannt. /deine your.exe funktioniert nämlich.
Das Problem ist der Name deiner .exe-Datei: votex's background changer v1.9.4.exe
Dieser enthält ein SingleQuote'. Du platzierst einen String welche ein SingleQuote enthält innerhalb von Singlequotes. Der Parser sieht das erste SQ und erkennt richig: hier beginnt der String er liest den String bis zu nächsten SQ, aber das gehört ja zum Namen 😖. aber davon weiß der Parser nichts, er versteht 'pfad\votex' . mit dem Rest kann er nichts anfangen. Schlimmer noch, das darauf folgende (scheinbar) "nackte" SingleQuote beginnt einen String : '; $s.Save() ,welcher bis zum Ende der Befehlszeile nicht mehr abgeschlossen wird. Damit kommt der Parser vollends aus dem tritt. Die Meckererei bzgl. der Klammern ist lediglich Ausdruck des Versuchs irgendwie System in das Chaos zu bringen.
Dateinamen welche, Zeichen wie `^'&%$#! enthalten sind perse zwar erlaubt, machen jedoch unter fast allen Betriebssystemen Ärger und sollten nicht verwendet werden!
Bei der Definition eines (Literal)Strings in Powershell kannst Du innerhalb von Singlequotes zun String gehörige Singelqotes Durch verdoppeln maskieren:
'Erzesel''s Heu'
Oder man Definiert einen "gewöhlichen" String:
"Erzesel's Heu"
...das ist aber Problematisch, da man in DoubleQuoted Strings auch Variablen Plazieren kann (nur singleQuote definieren Literale)
$var=6
"Erzesels$var"
'Erzesels$var'
output:
Erzesels6
Erzesels$var
da Du aber bereits den Einzeiler in der Kommandozeile in "DoubleQuotes" bindest wären \"maskierte innere Doublequotes\" nötig. (diese maskieren jedoch lediglich in der Batch-/cmd-Kommandozeile die Übergabe als Argument an Powershell) , aber nicht in PowershellScripten und schon garnicht in der BatchZeile.
Lösungalso entweder das SingleQuote in votex's vedoppeln:
powershell "$s=(New-Object -COM WScript.Shell).CreateShortcut('C:\Users\Erzesel Secure\Desktop\mylink.lnk');$s.TargetPath='votex''s background changer v1.9.4.exe';$s.Save()"
oder den String in maskierten DoubleQuotes\" übergeben:
powershell "$s=(New-Object -COM WScript.Shell).CreateShortcut('%userprofile%\\mylink.lnk');$s.TargetPath=\"votex's background changer v1.9.4.exe\";$s.Save()"
Wie gesagt, das Problem ist nicht das Script, sondern ein dumm gewählter Dateiname. in der 2. Variante würde es Ärger mit & oder $ geben!
Hybridscripting mit mehreren Sprachen ist nicht leicht, man muss die Regeln mehrerer Sprachen kennen und möglichst geschickt koordinieren 🥵
Wenn Du der Welt einen Gefallen tun willst verzichte auf auf ungebräuchliche Zeichen in Dateinamen......andere User wollen vielleicht au mal das Ding per Script verwenden und dürften dann auf ähnliche Problem stoßen.
votex background changer hätte auch genügt
`^'&%$#! ÄÖÜ? sowie diverse Unicode-Zeichen: §€ Akzente ,Chiesisch ,Kyrillisch...etc haben in Dateinamen nichts zu suchen.
VariablenNamen musst Du schon richtig Definieren: $var. Mit s$ kann Powershell nichts Anfangen.
Du musst wenigstens richtig Abschreiben 😱
powershell "$s=(New-Object -COM WScript.Shell).CreateShortcut('%USERPROFILE%\Desktop\Votex''s Background Changer v1.9.4.lnk'); $s.TargetPath='%USERPROFILE%\Documents\VBC-Backgrounds\Votex''s Background Changer v1.9.4.exe'; $s.Save()"
Danke für die ganzen Erklärungen! Das erstellen hat jetzt super geklappt. :)
Hab jetzt aber ein neues Problem.. Die Verknüpfung geht, allerdings ist es wichtig das sie in einem bestimmten Pfad ausgeführt wird.
Wenn du rechtsklick auf eine Verknüpfung machst steht dort ja der Zieltyp, Zielort, Ziel, etc.
Was bei der, über die Batch erstellte, Verknüpfung aber "nicht vorhanden" ist, ist das "Aufrühren in:" Feld. Damit meine ich das es lehr ist was es aber nicht sein darf. Es muss dringend ein Pfad angegeben sein. Ansonsten ist alles umsonst.
Kannst du mir bitte zeigen wie ich den "Ausführen in:" Pfad im Code hinzufügen kann?
kein Geheimnis:
$s.WorkingDirectory='c:\Bla\blubb'
ehe alles einzeln kommt, die übrigen Variablen sind:
.Arguments='was auch immer'
.IconLocation='pfad.ico/exe' oder in einer DLL: ='pfad.dll,indexnummer'
.Description='blubb'
.HotKey='Alt+X'
.WindowStyle=num (1,3 oder 7)
powershell "$s=(New-Object -COM WScript.Shell).CreateShortcut('%USERPROFILE%\Desktop\Votex''s Background Changer v1.9.4.lnk'); $s.TargetPath='%USERPROFILE%\Documents\VBC-Backgrounds\Votex''s Background Changer v1.9.4.exe';$s.WorkingDirectory='c:\Bla\blubb"; $s.Save()"
Danke danke danke! Hätte das jetzt nicht geklappt wäre bei dem Skript was ich gerade schreibe alles umsonst gewesen.
'%userprofile%\Desktop\mylink.lnk'
Der tatsächliche Dateiname (statt mylink) enthält ein Hochkomma. Das beißt sich mit den einfachen Anführungszeichen um den ganzen Pfad.
Nimm doppelte Anführungszeichen (schreibe \", weil der ganze Befehl in "..." steht) oder benenne die Datei um (verwende dort z.B. ein typographisch korrektes Apostroph).
Meintest du so?:
powershell "s$=(New-Object -COM WScript.Shell).CreateShortcut('%USERPROFILE%\Desktop\"Votex's Background Changer v1.9.4.lnk\"'); s$.TargetPath='%USERPROFILE%\Documents\VBC-Backgrounds\Votex's Background Changer v1.9.4.exe'; s$.Save()" > %USERPROFILE%\Desktop\errors.txt
Bei diesem Code kommt ebenfalls eine Fehler Meldung:
In Zeile:1 Zeichen:84
+ ... cript.Shell).CreateShortcut('C:\Users\Anwender\Desktop"Votex's Backgr ...
+ ~
")" fehlt in einem Methodenaufruf.
In Zeile:1 Zeichen:115
+ ... r v1.9.4.lnk"'); s$.TargetPath='C:\Users\Anwender\Documents\VBC-Backg ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Die Zeichenfolge hat kein Abschlusszeichen: ".
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingEndParenthesisInMethodCall
Nein, so:
powershell "...(\"%USERPROFILE%\Desktop\Votex's Background Changer v1.9.4.lnk\")..."
Aber beim genauen Hinsehen ist ja offenbar der TargetPath das Problem. Also:
TargetPath=\"C:\Path\to\your.exe\"
Erzesel hat das eben ganz ausführlich erklärt und andere Vorschläge gemacht, die womöglich besser funktionieren. Nur eins noch: Wir arbeiten nicht mehr unter MS-DOS, und auch Griechen und Chinesen dürfen heutzutage ihre Dateien „ganz normal“ benennen. Ich arbeite international und bekomme ständig Dateien mit ungewöhnlichen Namen. Je eher man sich darauf einstellt, desto weniger Probleme hat man später damit.
Auch nach dem maskieren erwartet er allerdings immer noch einen Ausdruck :/
Fehler Meldung: