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-Key: 290492

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

Printed on: April 19, 2024 at 23:04 o'clock

Mitglied: 122990
Solution 122990 Dec 09, 2015 updated at 15:22:34 (UTC)
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
Member: Gruenspecht
Gruenspecht Dec 09, 2015 updated at 14:38:22 (UTC)
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
Mitglied: 122990
Solution 122990 Dec 09, 2015 updated at 15:12:03 (UTC)
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"  
Mitglied: 122990
122990 Dec 09, 2015 at 14:43:30 (UTC)
Goto Top
In einer Batch sind Prozentzeichen Sonderzeichen und müssen deshalb verdoppelt werden.
Und dir fehlen haufenweise Anführungszeichen....
Member: Gruenspecht
Gruenspecht Dec 09, 2015 at 15:22:19 (UTC)
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.
Mitglied: 122990
Solution 122990 Dec 09, 2015 updated at 16:26:14 (UTC)
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
Member: Gruenspecht
Gruenspecht Dec 09, 2015 at 16:26:42 (UTC)
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?
Mitglied: 122990
Solution 122990 Dec 09, 2015, updated at Dec 11, 2015 at 16:42:12 (UTC)
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.
Member: Gruenspecht
Gruenspecht Dec 11, 2015 at 17:03:46 (UTC)
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.
Mitglied: 122990
Solution 122990 Dec 11, 2015, updated at Dec 12, 2015 at 09:07:04 (UTC)
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.
Member: Gruenspecht
Gruenspecht Dec 12, 2015 at 09:17:17 (UTC)
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.