petergyger
Goto Top

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

" 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
ps-clipboard

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

Content-ID: 7886133985

Url: https://administrator.de/contentid/7886133985

Ausgedruckt am: 23.11.2024 um 10:11 Uhr

erikro
erikro 18.07.2023 um 10:56:03 Uhr
Goto Top
Moin,

works as designed. Die Variablen sind leer, deshalb ist auch nichts vor den Gleichheitszeichen. Du musst das $ vor dem Variablennamen maskieren.

hth

Erik
Kraemer
Lösung Kraemer 18.07.2023 aktualisiert um 10:59:45 Uhr
Goto Top
Moin,

benutze ' statt "

Gruß

BTW:
Get-Clipboard | Out-File dienstag.ps1 
PeterGyger
PeterGyger 18.07.2023 um 11:07:33 Uhr
Goto Top
Hallo

Danke für das schnelle Feedback.

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

@Kraemer:

benutze ' statt "

BTW:
Get-Clipboard | Out-File dienstag.ps1 

Hall Kraemer

Danke! Workaround works. Und einen speziellen Dank für den Produktivitätsschub dank "Get-Clipbard"
Klassischer Fall von "Brett vor dem Kopf" - bzw. neue Technologien und alte Gewohnheiten... face-wink

Beste Grüsse
erikro
erikro 18.07.2023 um 13:46:16 Uhr
Goto Top
Moin,

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.

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
7426148943
7426148943 18.07.2023 um 13:47:56 Uhr
Goto Top
Und zum Nachlesen wie immer about_Quoting_Rules
PeterGyger
PeterGyger 18.07.2023 um 14:58:45 Uhr
Goto Top
Dann gerne die Langform:
Wenn Du auf der Powershell sowas eingibst:

$variable


Hallo Erik
Danke für die Langfassung.

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.

Wenn ich diesen Text abschliessend in eine Datei schreibe, dann ist das Text. Nicht binär.
Das parsern geschieht bei der Ausführung.

IMHO hat da PS eine sehr eigenwillige Logik...

Beste Grüsse
Kraemer
Kraemer 18.07.2023 um 15:12:33 Uhr
Goto Top
Zitat von @PeterGyger:

IMHO hat da PS eine sehr eigenwillige Logik...

naja - eigentlich ganz simpel. Variablen in " " werden ausgewertet, Variablen in ' ' nicht.

Mich nervt das allerdings auch immer wieder face-wink - kann aber enorm Code kürzen
erikro
erikro 18.07.2023 um 15:22:11 Uhr
Goto Top
Moin,

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.

Woher soll denn Deine Shell wissen, dass Du Code schreibst? face-wink

Wenn ich diesen Text abschliessend in eine Datei schreibe, dann ist das Text. Nicht binär.
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
PeterGyger
PeterGyger 18.07.2023 um 15:23:36 Uhr
Goto Top
Hallo Erik

Psychologisch ist mir klar, dass man sich an jede Marotte gewöhnt. Bzw. resigniert.
Zeppel hat mir auch den spannenden Artikel zu Quotes in PS verlinkt.

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?
Egal wie viele Quotes das ich einer Variable setze.

Ich kann in England auch auf der linken Strassenseite mein Auto fahren und parkieren. Dennoch wird das nichts an meiner Gewissheit ändern, dass der berühmte Ausspruch von Obelix hier seine berechtigte Anwendung findet.

Beste Grüsse
erikro
erikro 18.07.2023 um 15:29:43 Uhr
Goto Top
Moin,

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?

Nein, sind wir nicht. face-wink 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
PeterGyger
PeterGyger 19.07.2023 um 17:12:04 Uhr
Goto Top
Hallo erikro

Haha... es geht doch nichts über einen kleinen Diskurs...

Die VI hat bekannterweise zwei Modi.
Dasselbe kann man von CMD sagen.
Wenn ich in CMD einen Befehl eingebe und mit Enter bestätige, dann wird er ausgeführt.
Wenn ich mit "Copy con" eine Batchdatei erstelle, werden die Befehle nicht ausführt.
Dann bin ich quasi im Textmode, da ich eine Datei erstelle.
Das man dabei bei Text unterschiedliche Codespages berücksichtigen muss, ist technisch ein ganz anderer Sachverhalt.

Wenn ich der PS einen Text eingebe, also im Textmodus bin, dann hat die Shell keine Befehle auszuführen.
Nenne mir doch eine andere Shell die sich so verhält. Mir zumindest ist dieses Verhalten noch nie aufgefallen. Dazu kann ich nur "Obelix" sagen... face-wink

Da ich in Windows in Terminal ohnehin ein CMD Fenster offen habe, erstelle ich die kurzen Skripte einfach dort.

Einen schönen Abend