Fehler Meldung wegen PowerShell Befehl in Batch Skript. Wo ist der Fehler?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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ösung

also 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.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Nutzer4596 
Fragesteller
 15.12.2022, 21:03

Auch nach dem maskieren erwartet er allerdings immer noch einen Ausdruck :/

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

Fehler Meldung:

In Zeile:1 Zeichen:228
+ ... ts\VBC-Backgrounds\Votex''s Background Changer v1.9.4.exe'; s$.Save()
+                                                                         ~
Nach "(" wurde ein Ausdruck erwartet.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ExpectedExpression
0
Erzesel  15.12.2022, 21:22
@Nutzer4596

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()"
1
Nutzer4596 
Fragesteller
 15.12.2022, 21:37
@Erzesel

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?

0
Erzesel  15.12.2022, 21:59
@Nutzer4596

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()"
1
Nutzer4596 
Fragesteller
 15.12.2022, 22:12
@Erzesel

Danke danke danke! Hätte das jetzt nicht geklappt wäre bei dem Skript was ich gerade schreibe alles umsonst gewesen.

1
'%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).


Nutzer4596 
Fragesteller
 15.12.2022, 20:41

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
 
0
ralphdieter  15.12.2022, 21:12
@Nutzer4596

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.

0