schnerpf
Goto Top

Powershell: Maskierung und Auflösung

Hallo,
ich habe das Problem das ich mit der Maskierung und Auflösung einer Variablen nicht weiter komme.

Mein Befehl funktioniert in der Direkteingabe ohne Probleme.

--data '{ \"name\":\"Tom\" }'  

Den Wert den ich übergeben will, kommt aus einem Array $Name
Aber egal wie ich es anstelle, die Gegenseite wirft einen Fehler aus.
In meiner Not bin dann zum bauen von Zeichenketten übergegangen.

--data '{  $z"name"$z : $z"$($Name[$i])"$z }'  

Das funktioniert. Aber das kann ja eigentlich nicht die Lösung sein....
Hat vielleicht jemand die zündente Idee?

Gruß, Schnerpf

Content-Key: 7838173280

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

Printed on: December 4, 2023 at 10:12 o'clock

Member: Schnerpf
Schnerpf Jul 13, 2023 at 14:37:21 (UTC)
Goto Top
oh, ich sehe gerade das meinen Beitrag nicht mehr ergänzen kann.
Also hier die Variable $z nachgereicht

$z = '\"'  
Member: mayho33
mayho33 Jul 13, 2023 at 15:51:49 (UTC)
Goto Top
Hi,

Ich verstehe nur Bahnhof. Kannst du bitte vorne anfangen mit erklären?

  • was willst du genau machen?
  • wo gibst du was ein?
  • was ist denn die Gegenstelle?
  • wie lautet die Fehlermeldung?
  • das Array beinhaltet was?
          • ist es ein String-Array?
          • ein Array mit Object die weitere Properties enthalten?
  • was soll denn das --Data Ding sein? Ein Argument für die Commandline?

Du kannst nicht einfach ein zerknülltes Stück Papier mit ein paar Schnipsel hier rein werfen und erwarten, dass irgendjemand weiß was du willst.
Member: Crusher79
Crusher79 Jul 13, 2023 at 18:16:47 (UTC)
Goto Top
OH man....

Rate mal willst Webservice konsumieren o.ä.? Also nahand des Formats JSON?

https://www.windowspro.de/script/json-powershell-erzeugen-bearbeiten

https://www.thecodebuzz.com/making-powershell-post-request-with-body-jso ...


Ist das die Richtung?
Member: Schnerpf
Schnerpf Jul 14, 2023 at 07:07:30 (UTC)
Goto Top
Ok ich war vielleicht zu schüchtern. Hier die ganze Zeile
curl.exe -ik --request PUT --header $Cookie --header "Content-type: application/json" --data '{ \"name\":\"$($Name[0])\" }' https://localhost:8443/umsapi/v3/clients/$id  

Nach JSON musste erstmal googeln. Ja das soll es werden. Das war die Ausgangssituation. Das funktioniert nicht.
Member: mayho33
mayho33 Jul 14, 2023 at 07:31:42 (UTC)
Goto Top
Zitat von @Schnerpf:

Ok ich war vielleicht zu schüchtern. Hier die ganze Zeile
curl.exe -ik --request PUT --header $Cookie --header "Content-type: application/json" --data '{ \"name\":\"$($Name[0])\" }' https://localhost:8443/umsapi/v3/clients/$id  

Nach JSON musste erstmal googeln. Ja das soll es werden. Das war die Ausgangssituation. Das funktioniert nicht.

Na die Zeile ist nicht so wichtig. Wichtiger wäre dem Publikum die Frage strukturiert und verständlich aufzubereiten. Ich bin bestimmt nicht der einzige der wenig Lust hat, sich die Details zur Frage, die der Fragesteller weg gelassen hat, selbst aus dem Fingern zu saugen.

Dazu gibt es auch eine FAQ:
Wie Du eine Frage richtig stellst
Mitglied: 7426148943
7426148943 Jul 14, 2023 updated at 08:04:18 (UTC)
Goto Top
Wieso überhaupt curl wenn Powershell POST Requests doch nativ beherrscht ...? ­čśČ

$body = @{'name'=$Name[0]} | ConvertTo-JSON  
Invoke-RestMethod -Uri "https://localhost:8443/umsapi/v3/clients/$id " -Method Put -ContentType "application/json" -Body $body  
Zeppel

p.s. Zum Thema Maskieren: innerhalb von Hochkommas findet keine Variablen Expandierung statt ...
--data "{ `"name`":`"$($Name[0])*`"}"  
Anführungszeichen kann man entweder mit dem Backtick (`) innerhalb von Anführungszeichen einbauen, oder man verdoppelt die Anführungszeichen.
Wichtig für die Variablen-Expandierung ist aber das es ganz außen normale Anführungszeichen sind und keine Hochkommata.
Aber Powershell kennt hier ja bessere Methoden wie oben gezeigt ganz einfach das Umwandeln von Hashtables in JSON, dann braucht ma hier keine Stringwurst erstellen sondern kann ganz normal mit Objekten arbeiten.
$body = @{name='Blablub'} | ConvertTo-JSON  
Ergibt automatisch das gewünschte face-wink
{
    "name":  "BlaBlub"  
}
Member: Crusher79
Crusher79 Jul 14, 2023 at 08:34:54 (UTC)
Goto Top
Hallo, genau sowas dachte ich mir schon!

Früher hat man mal curl extra installiert. Dann war es ein Alias. Command Line und Powershell unterscheiden sich da. Kenne das, darum kam mir auch der Escape mit \ bekannt vor.!

Invoke-Webrequest oder Invoke-Restmehod: https://www.cloudsma.com/2018/05/invoke-restmethod-vs-invoke-webrequest/

Ansonsten in JSON oder von JSON konvertieren. Gibt genug Anleitungen. Würde also "curl" und die Sequenz oben aufgeben und es komplett in PS schreiben Da PS Objekte unterstützt, kannst du auch viele Datenquellen anzapfen und das in JSON umwandeln lassen und abschicken.

Man kann auch in PS Strings so formatieren, dass sie nicht interpretiert werden. Es wie unter "DOS" aussieht. Macht aber im Jahr 2023 alles keinen Sinn. Würde dir raten nach den beiden Befehlen oben zu schauen und wie man in JSON umwandelt.

mfg Crusher
Member: Schnerpf
Schnerpf Jul 14, 2023 updated at 11:05:55 (UTC)
Goto Top
Erstmal vielen Dank für Eure Beiträge.
Vieleicht ein wenig zu meinem Hintergrund. Ich habe mir das Scripten selbst beigebracht. Ich "klaue" mir überall die Versatzstücke aus Programmen von denen ich weiß, dass Sie funktionieren. Powershell ist als Object orientierte Sprache ein ganz anderes Kaliber, als alles was ich bis jetzt gelegentlich gemacht habe. Ich kämpfe mich mit Try & Error durch mein Programm und nähere mich so Stück für Stück meinem Ziel. Ist das ideal? Sicher nicht, aber so mache ich das schon lange und erreiche so meist mein Ziel. Daher sind mir viele Möglichkeiten, die PowerShell bietet unbekannt.

Also mache ich jetzt meine Hausaufgaben. Das wird ein wenig brauchen. Danach melde mich wieder.
Dank für Euren Input, Schnerpf
Mitglied: 7426148943
7426148943 Jul 14, 2023 updated at 11:13:34 (UTC)
Goto Top
Member: Schnerpf
Solution Schnerpf Jul 20, 2023 at 09:04:40 (UTC)
Goto Top
Es hat ein wenig gebraucht, bis ich alle fehlenden Informationen hatte. Da ich hier erfahren habe, das es auch ohne Curl geht, habe ich mich auf den Weg gemacht die Abfrage mit Powershell POST Requests zuerstelllen. Ich musste zwar herumfragen, aber so sieht meine funktionierende Lösung aus
$body = @{ 'name' = $Name } | ConvertTo-JSON                      #Füllen Body mit Übergabewert  


$session = [Microsoft.PowerShell.Commands.WebRequestSession]::new()

$cookie = [System.Net.Cookie]::new('JSESSIONID', $SessionID_ADM)  #Erstellen Objekt $cookie  

$session.Cookies.Add($UMS_Server, $cookie)                        #Füllen der Variable $session mit der SessionID meiner Sitzung am $UMS_Server

Invoke-RestMethod -Uri "$($Server)/umsapi/v3/clients/$($SerialNumber)" -Method Put -ContentType "application/json" -Body $body -WebSession $session  

Dafür bin auch ein Problem bei der Antwort des Servers gestossen, aber dafür mache ich eine neuen Task auf.

Gruß, Schnerpf