gruenspecht
Goto Top

URL decodieren mittels Batch-Aufruf

Habe aktuell ein Problem mit einer Batch-Datei unter DOS (CMD-Aufruf unter Win7/10):

Ziel ist es, ein URL so umzuwandeln, dass daraus ein ASCII-Text wird. Im konkreten Fall habe ich einen Link der so aussieht:

file:/M%3a/Unsere%20CD%20Sammlung/Achim%20Reichel%20-%20Hei%c3%9fe%20Scheibe%20-%2001%20-%20Er%20w%c3%bcrd%27%20so%20gern%20auf%20Rollschuh%27n%20fahr%27n.mp3
Ziel ist die Ausgabe in folgender Form:
M:/Unsere CD Sammlung/Achim Reichel - Heiße Scheibe - 01 - Er würd' so gern auf Rollschuh'n fahr'n.mp3
Dazu habe ich mir folgenden "Batch" ausgedacht, um im ersten Schritt erst mal aus dem "%20" ein Leerzeichen bzw. aus dem "%3a" einen Doppelpunkt zu machen:

@echo off
setlocal enabledelayedexpansion
set url=file:/M%3a/Unsere%20CD%20Sammlung/Achim%20Reichel%20-%20Hei%c3%9fe%20Scheibe%20-%2001%20-%20Er%20w%c3%bcrd%27%20so%20gern%20auf%20Rollschuh%27n%20fahr%27n.mp3
echo "%url%"  
pause

set "spa=%20"  
set "col=%3a"  

set url=%url:~6%

set url=!url:%spa%= !
echo "%url%"  
pause
set url=!url:%col%=:!
echo "%url%"  

pause
:ende
Leider sieht das Ergebnis nicht so aus wie erwartet:

"M:/Unsere CD S:mmlung/:chim Reichel - Hei9fe Scheibe -  1 - Er wbcrd7 so gern :uf Rollschuh7n f:hr7n.mp3" 
Da sind also alle "A" getauscht und nicht nur das "%3a" hinter dem Laufwerksbuchstaben (M) und die %20-Wandlung hat mir auch die Laufnummer 01 zerstört.

Gebe ich meinen Ausgangsstring bei http://url-encoder.de/ ein, so geht das problemlos. Wie aber kann ich diese Funktionalität in einem BAT-Script abbilden?

Hat jemand eine Idee dazu?

Content-ID: 290492

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

Ausgedruckt am: 26.11.2024 um 10:11 Uhr

122990
Lösung 122990 09.12.2015 aktualisiert um 16:22:34 Uhr
Goto Top
Moin,
simpler Powershell-Einzeiler
[System.Net.WebUtility]::UrlDecode('file:/M%3a/Unsere%20CD%20Sammlung/Achim%20Reichel%20-%20Hei%c3%9fe%20Scheibe%20-%2001%20-%20Er%20w%c3%bcrd%27%20so%20gern%20auf%20Rollschuh%27n%20fahr%27n.mp3')  

Gruß grexit
Gruenspecht
Gruenspecht 09.12.2015 aktualisiert um 15:38:22 Uhr
Goto Top
Irgendwie sieht das ganz einfach aus. Habe aber leider noch nie mit Powershell gearbeitet.

Habe mir mal folgendes ausgedacht:

param(
[string]$url)

# Script ...
Write-Host $url

$Decode = [System.Net.WebUtility]::UrlDecode($url)

Write-Host $url
Write-Host $Decode


Ziel ist es, dem Powershellscript den String in die Variable "url" zu übergeben, dann zu wandeln und das ganze wieder zurückzugeben. Aber irgendwie bekomme ich das nicht an den Start. Meine Befehlsfolge "$Decode = [System.Net.WebUtility]::UrlDecode($url)" ist Schrott.

Danke schon jetzt für einen erhellenden Tipp.

PS: Ach ja - die Übergabe kommt aus einer BAT-Datei:

wie folgt:
@echo off

PowerShell.exe -ExecutionPolicy Bypass -Command "& 'C:\Temp\einzeiler.PS1'" file:/M%3a/Unsere%20CD%20Sammlung/Achim%20Reichel%20-%20Hei%c3%9fe%20Scheibe%20-%2001%20-%20Er%20w%c3%bcrd%27%20so%20gern%20auf%20Rollschuh%27n%20fahr%27n.mp3  

pause
122990
Lösung 122990 09.12.2015 aktualisiert um 16:12:03 Uhr
Goto Top
param([string]$url)
return [System.Net.WebUtility]::UrlDecode($url)
Und dann das Powershell-Skript so aufrufen
Powershell -Executionpolicy ByPass -File "c:\deinscript.ps1" "DEINEURL"  
122990
122990 09.12.2015 um 15:43:30 Uhr
Goto Top
In einer Batch sind Prozentzeichen Sonderzeichen und müssen deshalb verdoppelt werden.
Und dir fehlen haufenweise Anführungszeichen....
Gruenspecht
Gruenspecht 09.12.2015 um 16:22:19 Uhr
Goto Top
Vielen DANK, "Grexit"! Läuft alles so, wie es soll.

Danke auch für den Hinweis, auf die Sonderzeichen bzw. Anführungszeichen. Du siehst, ich mache das nicht so häufig. face-wink

Abschließend noch eine Frage zu der Rückübertragung von Powershell zur BAT-Datei. Wie kann ich da denn die berichtigte URL wieder aufnehmen.

DANKE schon jetzt für die tatkräftige Hilfe.
122990
Lösung 122990 09.12.2015 aktualisiert um 17:26:14 Uhr
Goto Top
Abschließend noch eine Frage zu der Rückübertragung von Powershell zur BAT-Datei. Wie kann ich da denn die berichtigte URL wieder aufnehmen.
Mit einer FOR-Schleife, insgesamt dann also bspw. so wenn du die Url als Parameter an die Batch übergibst.
@echo off
set "url=%~1"  
for /f "delims=" %%a in ('powershell -Executionpolicy Bypass -Command "[System.Net.WebUtility]::UrlDecode('%url%')"') DO set "result=%%a"  
echo %result%
Aufruf
deineBatch.cmd "DEINEURL"  
DANKE schon jetzt für die tatkräftige Hilfe.
Keine Ursache, machen wir doch gerne face-smile
Gruenspecht
Gruenspecht 09.12.2015 um 17:26:42 Uhr
Goto Top
SUPER - vielen Dank auch dafür.

Auf meinem Win10-Rechner läuft nun alles einwandfrei. Starte ich das Powershell-Script auf meinen Win7-Rechner, so sagt mir Powershell, dass "der Typ [System.Net.WebUtility] nicht gefunden werden kann. Kann man den nachinstallieren?
122990
Lösung 122990 09.12.2015, aktualisiert am 11.12.2015 um 17:42:12 Uhr
Goto Top
Die WebUtility-Klasse ist erst ab .NET 4.0 enthalten und benötigt mindestens das Management Framework 3.0 , d.h. wenn du auf mindestens PS 3.0 auf deinem Windows 7 upgradest ist sie auch dort verfügbar.
Gruenspecht
Gruenspecht 11.12.2015 um 18:03:46 Uhr
Goto Top
DANKE Grexit. Habe das neue Management Framework installiert und nun läuft es.

Leider gibt es noch in der DOS-BAT ein Problem.

Der Befehl dort lautet ja:

Powershell -Executionpolicy ByPass -File "C:\Progs\Powershell\MeinScript.PS1" "file:/M%3a/Unsere%20CD%20Sammlung/Achim%20Reichel%20-%20Hei%c3%9fe%20Scheibe/Achim%20Reichel%20-%20Hei%c3%9fe%20Scheibe%20-%2011%20-%20Er%20w%c3%bcrd%27%20so%20gern%20auf%20Rollschuh%27n%20fahr%27n.mp3"  


Leider kommt die "Prozentkodierung" nicht im Powershell Script an.

In der ersten Variablen kommt leider nur das hier an.

file:/Ma/Unsere0CD0Sammlung/Achim0Reichel0-0Hei9fe0Scheibe/Achim0Reichel0-0Hei9fe0Scheibe0-0110-0Er0wbcrd70so0gern0auf0Rollschuh7n0fahr7n.mp3


Übergebe ich von außen (beim Aufruf der DOS-BAT) den String an eine Variable in der DOS-BAT-Datei und übergebe ich diese dann als

Powershell -Executionpolicy ByPass -File "C:\Progs\Powershell\MeinScript.PS1" %1  


an das Powershell-Script, ist die Welt OK und das Powershell-Script decodiert alles richtig.

Ich vermute ein Problem mit der Codepage von der Batchdatei, aber wissen tu ich es nicht. face-wink

Grüße und schönes Wochenende.
122990
Lösung 122990 11.12.2015, aktualisiert am 12.12.2015 um 10:07:04 Uhr
Goto Top
Zitat von @Gruenspecht:
Übergebe ich von außen (beim Aufruf der DOS-BAT) den String an eine Variable in der DOS-BAT-Datei und übergebe ich diese dann als

Powershell -Executionpolicy ByPass -File "C:\Progs\Powershell\MeinScript.PS1" %1  
an das Powershell-Script, ist die Welt OK und das Powershell-Script decodiert alles richtig.
Und so soll es auch sein !! Weil ein Parameter nicht vom Interpreter geparst wird
Ich vermute ein Problem mit der Codepage von der Batchdatei, aber wissen tu ich es nicht. face-wink
Nein nix problem mit Codepage, wie ich oben schon geschrieben habe sind Prozentzeichen, werden sie direkt in die Batch geschrieben Sonderzeichen für eine Variable und werden beim parsen durch Werte ersetzt, d.h. das du alle Prozentzeichen verdoppeln müsstest wenn du tatsächlich so einen String in die Batch direkt rein schreibst !!
http://www.robvanderwoude.com/escapechars.php

Aber das machst du doch nicht wirklich ?? Das Dingens soll doch bestimmt immer wieder andere URLs dekodieren oder ? Den String dann plain in die Batch zu schreiben wäre dann ja kontraproduktiv.
Gruenspecht
Gruenspecht 12.12.2015 um 10:17:17 Uhr
Goto Top
Aber das machst du doch nicht wirklich ?? Das Dingens soll doch bestimmt immer wieder andere URLs dekodieren oder ? Den String dann plain in die Batch zu schreiben wäre dann ja kontraproduktiv.

Danke für die Info. Klar schreibe ich den String nicht per Hand in die Textdatei. Der Link kommt natürlich aus einer anderen Applikation.

Bei der Verdopplung von %-Zeichen bin ich bis jetzt davon ausgegangen, dass dies nur für Variablen in den DOS-Batch-Dateien gilt. Für in Anführungszeichen eingeschlossenen Text - wie in unserem Beispiel - hatte ich das bis dato nicht so gesehen. Nun gut. Wieder was gelernt.

DANKE für die Tipps und Grüße aus der Werkzeugstadt Remscheid.