Powershell: Code aus Zwischenablage
Hallo
Ausgangslage
Sachverhalt sowohl in Powershell 5.x als auch 7.x
Analog zu "copy con" in der CMD Shell kann ich in PS ein Skript direkt erstellen über
Wenn ich nach >> diesen Code aus dem Clipboard einfüge
Dann erhalte ich das
Mir ist der Sachverhalt von Codepages in der CMD bekannt.
Aber welche Mechanismen / Konfigurationen generieren diesen Fehler?
Workaround?
Danke für einen Lichtblick in den Sachverhalt
Beste Grüsse
Ausgangslage
Sachverhalt sowohl in Powershell 5.x als auch 7.x
Analog zu "copy con" in der CMD Shell kann ich in PS ein Skript direkt erstellen über
" blabla <ENTER>
>>blabla <ENTER>
>>mehr blabla <ENTER>
>>fertigblabla" | out-file dienstag.ps1
Wenn ich nach >> diesen Code aus dem Clipboard einfüge
# 3 small and big
$smallestFiles = $files | Select-Object -First 3
$largestFiles = $files | Select-Object -Last 3
# show result
$smallestFiles
$largestFiles
Dann erhalte ich das
Mir ist der Sachverhalt von Codepages in der CMD bekannt.
Aber welche Mechanismen / Konfigurationen generieren diesen Fehler?
Workaround?
Danke für einen Lichtblick in den Sachverhalt
Beste Grüsse
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 7886133985
Url: https://administrator.de/contentid/7886133985
Ausgedruckt am: 23.11.2024 um 10:11 Uhr
11 Kommentare
Neuester Kommentar
Moin,
Dann gerne die Langform:
Wenn Du auf der Powershell sowas eingibst:
wird die Variable ausgewertet und ihr Inhalt benutzt. Ist die Variable leer oder existiert nicht, dann steht da eben nichts.
Möchte man das nicht, dann muss das $ maskiert werden. Entweder geschieht das durch einen vorangestellten Backtick oder, wie es @Kraemer für Deinen Fall vorgeschlagen hat, indem man den ganzen String in Hochkommata statt in Anführungszeichen einfasst.
Damit wird die Auswertung der Variablen ausgeschaltet und $variable ausgegeben.
Liebe Grüße
Erik
Zitat von @PeterGyger:
@eriko
works as designed. Die Variablen sind leer, deshalb ist auch nichts vor den Gleichheitszeichen. Du musst das $ vor dem Variablennamen maskieren.
Weder kann ich die Logik dieser Aussage nachvollziehen, noch sehe ich den Workaround. Entschuldigung.
@eriko
works as designed. Die Variablen sind leer, deshalb ist auch nichts vor den Gleichheitszeichen. Du musst das $ vor dem Variablennamen maskieren.
Dann gerne die Langform:
Wenn Du auf der Powershell sowas eingibst:
$variable
wird die Variable ausgewertet und ihr Inhalt benutzt. Ist die Variable leer oder existiert nicht, dann steht da eben nichts.
Möchte man das nicht, dann muss das $ maskiert werden. Entweder geschieht das durch einen vorangestellten Backtick oder, wie es @Kraemer für Deinen Fall vorgeschlagen hat, indem man den ganzen String in Hochkommata statt in Anführungszeichen einfasst.
`$variable
'$variable'
Damit wird die Auswertung der Variablen ausgeschaltet und $variable ausgegeben.
Liebe Grüße
Erik
Und zum Nachlesen wie immer about_Quoting_Rules
naja - eigentlich ganz simpel. Variablen in " " werden ausgewertet, Variablen in ' ' nicht.
Mich nervt das allerdings auch immer wieder - kann aber enorm Code kürzen
Moin,
Gerne.
Woher soll denn Deine Shell wissen, dass Du Code schreibst?
Auf der Shell wird das ja schon ausgeführt. Das ist der Unterschied zum Editor. Nehmen wir mal an, Du willst auf der Shell mal schnell was in eine Datei schreiben z. B. die letzte Fehlermeldung. Dann geht das so:
Das ist für die Shell das Gleiche wie das, was Du versucht hast.
Nö, sie ist halt kein Mensch, der kontextabhängig erkennen kann, ob Du Code schreiben oder irgend einen Inhalt einer Variablen abrufen willst.
Liebe Grüße
Erik
Zitat von @PeterGyger:
Danke für die Langfassung.
Gerne.
Seit wann wird eine Variable ausgewertet, wenn man Code schreibt?
Ob ich nun im Editor oder direkt in der CLI Codezeilen schreibe, dann ist das Text.
Ob ich nun im Editor oder direkt in der CLI Codezeilen schreibe, dann ist das Text.
Woher soll denn Deine Shell wissen, dass Du Code schreibst?
Wenn ich diesen Text abschliessend in eine Datei schreibe, dann ist das Text. Nicht binär.
Das parsern geschieht bei der Ausführung.
Das parsern geschieht bei der Ausführung.
Auf der Shell wird das ja schon ausgeführt. Das ist der Unterschied zum Editor. Nehmen wir mal an, Du willst auf der Shell mal schnell was in eine Datei schreiben z. B. die letzte Fehlermeldung. Dann geht das so:
$error | out-file error.txt
Das ist für die Shell das Gleiche wie das, was Du versucht hast.
IMHO hat da PS eine sehr eigenwillige Logik...
Nö, sie ist halt kein Mensch, der kontextabhängig erkennen kann, ob Du Code schreiben oder irgend einen Inhalt einer Variablen abrufen willst.
Liebe Grüße
Erik
Moin,
Nein, sind wir nicht. Die Shell ist der Interpreter. Wenn ich dem eine Variable ohne Maskierung übergebe, dann wird die sofort ausgewertet. Wie schon oben gesagt: works as designed.
Liebe Grüße
Erik
Zitat von @PeterGyger:
Aber...
Wir sind uns grundsätzlich einig, dass wenn wir am Code schreiben bzw. aus dem Clipboard einfügen sind, dann hat der Interpreter / Compiler zu warten, bis ich "go" sage?
Aber...
Wir sind uns grundsätzlich einig, dass wenn wir am Code schreiben bzw. aus dem Clipboard einfügen sind, dann hat der Interpreter / Compiler zu warten, bis ich "go" sage?
Nein, sind wir nicht. Die Shell ist der Interpreter. Wenn ich dem eine Variable ohne Maskierung übergebe, dann wird die sofort ausgewertet. Wie schon oben gesagt: works as designed.
Liebe Grüße
Erik