zeddler0
Goto Top

PS: raw bzw. rohe zeichenkentten zerlegen u. zeichenkette in einer zeichenkette ausschneiden

grüße.

#1
ich habe diesen befehl:
(((Invoke-WebRequest -UseBasicParsing -Method 'POST' -Uri 'https://store.rg-adguard.net/api/GetFiles' -Body 'type=url&url=https://apps.microsoft.com/store/detail/rufus/9PC3H3V7Q9CH&ring=Retail' -ContentType 'application/x-www-form-urlencoded').Links.outerHTML) | Select-String -Pattern 'Rufus' | Select-String -Pattern 'appx')  

der mir filgende ausgabe liefert:
<a href="http://tlu.dl.delivery.mp.microsoft.com/filestreamingservice/files/4d97ebfa-27a2-46cc-a860-978517c653bb?P1=1659173787&P2=404&P3=2&P4=mGAwPjTwY2hN54bD22E3fzsIcehHbNUzblvJ%2fgSpJh9KltcEZoLgYZKwHuIOf5xSjSgT66awNyPfPIV5qoDHmg%3d%3d"  
rel="noreferrer">19453.net.Rufus_3.19.1911.0_neutral_~_y8nh7bq2a8dtt.appxbundle</a>  

ich würde gern die 2 werte isolieren.
da ich ein einzeiler brauche, so werde ich den befehl für jeden wert einzeln ausführen.
dieser befehl würd später über die cmd-shell mit einer for-schleife ausgeführt.

ich habe das gefühl ich hab irgend ein befehl übersehen... o.O

#2
aber diese ausgabe erinnert mich an ein allgemeineres problem.

ich habe eine zeichenkette:
...uvwxyzabcd#efghijklmno#pqrst#uvwxyzabcd...
und normalerweise wird ein trennzeichen bestimmt um zeichenketten zu zerlegen.
hier ' # '

also habe ich mir gedacht wäre es nicht möglich zusagen:
- am anfang befindet sich "bcd"
- am ende befindet sich "uvw"
- gebe mir den inhalt dazwischen "#efghijklmno#pqrst#"

da ich die sonderzeichen im wert behalten möchte.

diese #2 aufgabe ist konstroiert,
wein workaround ist zwar lustig,
aber ich hätte gern dieses problem gelöst,
bzw. erklärt warum es so nicht umsetzbar ist


vielen dank.

Content-ID: 3495550772

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

Ausgedruckt am: 18.11.2024 um 01:11 Uhr

colinardo
Lösung colinardo 30.07.2022 aktualisiert um 12:44:07 Uhr
Goto Top
Servus.
ich habe das gefühl ich hab irgend ein befehl übersehen... o.O
Jepp, das lässt sich ganz einfach lösen in dem du es einfach objektorientiert machst, so wie man fast alles in der Powershell am besten gleich objektorientiert abarbeitet
@echo off
for /f "tokens=1,2 delims=|" %%a in ('powershell -EP Bypass -C "(Invoke-WebRequest -Method Post -Uri 'https://store.rg-adguard.net/api/GetFiles' -Body 'type=url&url=https://apps.microsoft.com/store/detail/rufus/9PC3H3V7Q9CH&ring=Retail' -ContentType 'application/x-www-form-urlencoded').Links | ?{$_.innerText -match 'Rufus.*appx'} | %%{$_.innerText + '|'+ [System.Net.WebUtility]::HtmlDecode($_.href)}"') do (  
    echo Name: %%a
    echo Link: %%b
)
Das Zerlegen der HTML-Tags mit Regular Expressions ist hier also nicht nötig, kann man machen ist hier aber überflüssig da Invoke-WebRequest die nötigen Attribute schon für dich aufteilt.
Falls es dich trotzdem interessiert hier mal anhand deines Beispiels oben (beachte das man hier im Regex einige Zeichen wegen der Ausführung in einer Batchdatei/For-Loop extra escapen muss wie bspw. das Anführungszeichen und die Tilde(^))
@echo off
for /f "tokens=1,2 delims=|" %%a in ('powershell -EP Bypass -C "(Invoke-WebRequest -Method Post -Uri 'https://store.rg-adguard.net/api/GetFiles' -Body 'type=url&url=https://apps.microsoft.com/store/detail/rufus/9PC3H3V7Q9CH&ring=Retail' -ContentType 'application/x-www-form-urlencoded' -UseBasicParsing).Links.outerHTML | ?{$_ -match 'href=\"([^^^^\"]+).*?>(.*Rufus.*appx.*)<'} | %%{$matches[2] + '|' + $matches[1]}"') do (  
    echo Name: %%a
    echo Link: %%b
)
So würde ich es aber wie gesagt definitv nicht machen wollen ...

Der Powershell-Part verbinden beide Teile (Name und Link) mittels '|' gibt sie aus und die For-Schleife splittet diese dann mit dem Delimiter '|' für die Nutzung in der Batch. Zwei extra Aufrufe also ebenfalls überflüssig.

Grüße Uwe

p.s.
da ich ein einzeiler brauche, so werde ich den befehl für jeden wert einzeln ausführen. dieser befehl würd später über die cmd-shell mit einer for-schleife ausgeführt.
Powershell lässt sich auch schön hybrid in einer Batch ausführen, Einzeiler vollkommen überflüssig face-wink.
zeddler0
zeddler0 30.07.2022 um 12:45:09 Uhr
Goto Top
ui, das ging ja schnell.
big thx.

gibt es zu meiner konstruierten #2 frage auch eine lösung?
colinardo
colinardo 30.07.2022 aktualisiert um 12:53:32 Uhr
Goto Top
Zitat von @zeddler0:

ui, das ging ja schnell.
big thx.

gibt es zu meiner konstruierten #2 frage auch eine lösung?

Ja, siehe zweites ergänztes Beispiel in meinem Kommentar oben. => Regular Expressions sind dein Freund
'...uvwxyzabcd#efghijklmno#pqrst#uvwxyzabcd...' -replace '.*bcd(.*)uvw.*','$1'  
oder
'...uvwxyzabcd#efghijklmno#pqrst#uvwxyzabcd...' -match '.*bcd(.*)uvw.*' | out-null  
$matches[1]
oder
'...uvwxyzabcd#efghijklmno#pqrst#uvwxyzabcd...' -match '(?<=bcd).*(?=uvw)' | out-null  
$matches
oder
[regex]::match('...uvwxyzabcd#efghijklmno#pqrst#uvwxyzabcd...','(?<=bcd).*(?=uvw)').Value  
usw.

Regex hilft dir bei jeglichen Text-Extrahierungen in der Regel immer weiter, sei das Problem auch noch so komplex.
zeddler0
zeddler0 30.07.2022 um 12:58:19 Uhr
Goto Top
ganz kurz zu #1

ich bekomme diese ausgabe:
http://tlu.dl.delivery.mp.microsoft.com/filestreamingservice/files/4d97ebfa-27a2-46cc-a860-978517c653bb?P1=1659179231&amp;P2=404&amp;P3=2&amp;P4=j7zcjAmTKD%2fNxp8dW8480LzJNilo0ykd49ZW%2fN%2bxsPSwaGQxcvDP2KosZ3QJEl2DUVXPAHlS3NvnL0vvr9N3Pw%3d%3d
der richtige link ist aber:
http://tlu.dl.delivery.mp.microsoft.com/filestreamingservice/files/4d97ebfa-27a2-46cc-a860-978517c653bb?P1=1659179155&P2=404&P3=2&P4=Ndyx3LP0ikcjI5Qv14813g2nClQs2ocxs8czmH1BdqpJnZszZFb0Nj%2f%2fpUMa9oK1X2mX5u5qZgtE9IzMgq4%2bXg%3d%3d

da hat sich ein ' amp; ' hineingeschlichen... face-sad
colinardo
colinardo 30.07.2022 aktualisiert um 13:34:26 Uhr
Goto Top
Da hat die IE-Engine entsprechende HTML Entities für das "&" eingefügt, habe oben einen kleinen Fix dafür hinzugefügt. Solche Links werden in der Regel automatisch korrigiert wenn man sie in einem Browser klickt.
https://stackoverflow.com/questions/11864864/is-using-amp-as-a-query-par ...
Passiert aber nicht wenn man das ganze einem Tool zum Download verfüttert.

Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.

Schönes Wochenende.