Urldecode in batch file - url

How can I 'urldecode' the following string in a batch file? I need to change the following
http://www.example.com/some-page/some/link.html
to this
http://www.example.com/some-page/some/link.html
It can be done in Javascript with decodeURIComponent() but I've no idea how to do it in a batch file just within MSDOS etc.

It can be done in Javascript with decodeURIComponent() but I've no idea how to do it in a batch file just within MSDOS etc.
Not with decodeURIComponent(), no. Be that as it may, the solution still lies with invoking JavaScript. You can call on the IE7 JavaScript engine via JScript. See this page for more examples of batch + JScript hybrid scripts.
There are no built-in JavaScript functions to convert HTML entities (the ΓΏ characters) back to plain text, but it's not too difficult to roll your own.
#if (#CodeSection == #Batch) #then
:: batch portion
#echo off
setlocal
set "url=http://www.example.com/some-page/some/link.html"
cscript /nologo /e:JScript "%~f0" "%url%"
goto :EOF
#end
// JScript portion
function decodeEntities(what) {
return what.replace(/&#x([0-9a-f]{2});/ig, function(m, $1) {
return String.fromCharCode(parseInt($1, 16));
});
}
WSH.Echo(decodeEntities(WSH.Arguments(0)));
Just as an academic exercise, here's a pure batch method of converting HTML character entities to ASCII. It's slightly slower than the JScript hybrid, and it'll probably mistreat strings containing exclamation marks.
#echo off
setlocal enabledelayedexpansion
set "url=http://www.example.com/some-page/some/link.html"
set "url=%url:&#x=;0x%"
:begin
for %%I in (%url%) do (
set "chunk=%%~I"
if "!chunk:~0,2!"=="0x" if "!chunk:~4,1!"=="" (
for /f "delims=" %%x in (
'forfiles /m "%~nx0" /c "cmd /c echo(%%~I"'
) do set "url=!url:;%%I;=%%~x!"
goto begin
)
)
)
echo !url!

This may be achieved in pure Batch...
#echo off
setlocal EnableDelayedExpansion
set "input=http://www.example.com/some-page/some/link.html"
rem Define the equivalences
for %%a in ("#x3a=:" "#x2f=/") do (
for /F "tokens=1,2 delims==" %%b in (%%a) do set "replace[%%b]=%%c"
)
echo Input = "%input%"
set "input=%input:&=\%"
set "output="
for %%a in (%input%) do (
for /F "tokens=1,2 delims=\" %%b in ("%%a") do (
if "%%c" neq "" (
set "output=!output!%%b!replace[%%c]!"
) else (
set "term=%%a"
if "!term:~0,1!" equ "\" (
set "output=!output!!replace[%%b]!"
) else (
set "output=!output!%%b"
)
)
)
)
echo Output = "%output%"

#if (#x)==(#y) #end /***** jscript comment ******
#echo off
set "url=http://www.example.com/some-page/some/link.html"
cscript //E:JScript //nologo "%~f0" "%url%"
exit /b 0
#if (#x)==(#y) #end ****** end comment *********/
var args=WScript.Arguments;
//WScript.Echo(args.Item(0));
WScript.Echo(decodeURIComponent(args.Item(0)));
though this definitely is not uri encoded url...

Related

Comparison of strings using variables always false (in Batch)

In my current folder, I have a file named backup(yyyy-mm-dd).7z
I need to keep that length variable even though here it is a constant.
#echo off
setlocal EnableDelayedExpansion
set "a=.\backup"
set "b=yyyy-mm-dd"
set "length=19"
for %%f in (.\*) do (
set "fullpath=%%f"
set "trimpath=!fullpath:~0,%length%!"
set trimpath
echo trimpath=%trimpath%
if %trimpath% == %a%(%b% echo this is equal
)
I have 2 questions regarding that code:
Why can I see the value of trimpath when I call set trimpath but not directly with %trimpath%?
Why is my condition false? What should I do to get it true?
Here is the solution after following #foxidrive and #JosefZ advices!
#echo off
setlocal EnableDelayedExpansion
set "a=.\backup"
set "b=yyyy-mm-dd"
set "length=19"
for %%f in (.\*) do (
set "fullpath=%%f"
set "trimpath=!fullpath:~0,%length%!"
echo trimpath=!trimpath!
if "!trimpath!" == "%a%(%b%" echo this is equal
)
If you need to test the solution, just create a file named backup(yyyy-mm-dd) in your current folder.

batch cmd parsing and rewriting an ini file

I'm trying to make changes to an existing ini file and then rewrite those changes to a new ini file. The problem I am having is parsing the sections doesn't seem to work. If I use the following code:
set reso=%2
set RESLINE=RESMAX=0.72
set nRESLINE=RESMAX=%reso%
setlocal enableDelayedExpansion
(
for /F "tokens=* delims=" %%a in ('findstr "^" %INIFILE%') do (
set "lines=%%a"
if defined lines set "lines=!lines:%p4p%=%new%!"
if defined lines set "lines=!lines:%RESLINE%=%nRESLINE%!"
echo(!lines!
)
) > new.ini
I get out a new.ini file which when the %p4p% variable is found in line, it replaces it with %new% which is fine.
But when the RESLINE hits my output shows:
0.72=RESMAX=0.70=0.72
instead of:
RESMAX=0.70
as desired. I suspect this is because of the "=" being present in the strings, but I'm not sure how to get around it.
What I've tried doing instead is the following:
setlocal enableDelayedExpansion
(
for /F "tokens=* delims=" %%a in ('findstr "^" %INIFILE%') do (
set "lines=%%a"
if defined lines set "lines=!lines:%p4p%=%new%!"
for /f "tokens=1,2 delims==" %%y in ('%lines%') do (
if %%y==RESMAX (
set "oRES=%%z"
set "lines=!lines:%oRES%=%reso%!"
)
)
echo(!lines!
)
) > test.ini
But it seems in this case that the nested for doesn't ever read in the right information.
I assumed what I was attempting here was to parse the read in line which should be of the format PARAM=VALUE, then check if the PARAM is = the word RESMAX and if it is, assign its corresponding value to the var oRES and then set the read-in line to now say RESMAX=newvalue. I've tried replacing the %lines% with !lines! but that just gets me a series of errors saying the various ini params don't exist as acceptable programs/batchs.
Any help would be much appreciated.
Thanks
set "reso=%2"
set "old_reso=0.72"
set "RESLINE=RESMAX=0.72"
set "nRESLINE=RESMAX=%reso%"
setlocal enableDelayedExpansion
(
for /F "tokens=* delims=" %%a in ('findstr "^" %INIFILE%') do (
set "lines=%%a"
if defined lines set "lines=!lines:%p4p%=%new%!"
if defined lines (
rem set "lines=!lines:%RESLINE%=%nRESLINE%!"
echo !lines! | find /i "%RESLINE%" >nul 2>&1 && (
set "lines=!lines:%old_reso%=%reso%!"
)
)
(echo(!lines!)
)
) > new.ini
Try this. Or check dbenham's REPLVAR (the problem is that you cant directly replace the = sign)

How do I create a batch file that reads a file and writes a substring into another file?

I currently have an exported text file (output.txt) from a Clear-Case command that I need to parse. It looks like this:
Comparing the following:
R1.PROD.V1#\VOB_pvob
R2.PROD.V1#\VOB_pvob
Differences:
>> M:\ACME_PROD\src\ACME##
>> M:\ACME_PROD\src\ACME\file 2.txt##
>> M:\ACME_PROD\src\ACME\file 1.txt##
>> M:\ACME_PROD\src\ACME\file 3.txt##
What I would like to do is use the findstr command to filter the strings that are contained between the ">> " and "##" strings to get an output file that looks like this (with quotes if possible:
"M:\ACME_PROD\src\ACME"
"M:\ACME_PROD\src\ACME\file 2.txt"
"M:\ACME_PROD\src\ACME\file 1.txt"
"M:\ACME_PROD\src\ACME\file 3.txt"
I am new to writing batch files and so I don't exactly know where to start. I have managed to find code that can loop through the lines of a text file and separate code for the findstr command, but I get stuck trying to put it all together!
Best regards,
Andrew
Here you go
setlocal enabledelayedexpansion
for /f "skip=1 tokens=* delims=> " %%a in ('"findstr /r [\w^>*] output.txt"') do (
set line=%%a
set line=!line:#=!
echo "!line!" >>new.txt
)
The filtered strings will be outputted into new.txt.

echo "example" | clip, adds unwanted linebreak

So - I'm using an image capture tool (snagit).
By default, the image itself is saved to the clipboard (after a capture).
I would prefer that the image's path stored in the clipboard.
The application allows me to (instead) save the file, and pass the image as an argument to an external application. I'm passing it to the following .vbs file:
Dim Clipboard
Set args = WScript.Arguments
if args.length > 0 then
arg1 = trim(args.Item(0))
else
arg1 = "(No Data)"
end if
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "cmd /C echo "&arg1&" | CLIP", 2
This does 99% of what I want, except I find that 'ECHO ... | CLIP' tends to append formfeed/carriage return chars to my string.
Is there a better command I can use (in either cmd/vbs)?
Thanks in advance.
I seriously doubt your code produces <formfeed><carriage return> on the clipboard. It should produce <carriage return><line feed> at the end. Those are the standard line termination characters on Windows. They are automatically added by the ECHO command.
You can write to stdout without the new line using <NUL SET /P "=message"
I don't understand why you are using VBS when it can't access the clipboard directly. It makes more sense to me to use a batch file.
#echo off
setlocal
set "arg1=%~1"
if not defined arg1 set "arg1=(No Data)"
<nul set /p "=%arg1%"|clip
or as a one line batch file:
#if "%~1"=="" (<nul set/p"=(No Data)"|clip) else <nul set/p"=%~1"|clip
If you really want to use VBS, then here it is
Dim args, arg1, objShell
Set args = WScript.Arguments
if args.length > 0 then
arg1 = trim(args.Item(0))
else
arg1 = "(No Data)"
end if
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "cmd /C <nul set /p ""="&arg1&""" | CLIP", 2

Batch : getting the last folder name from a absolute path

I am using a Batch script to automatically backup files to my NAS and I need to get the last folder name from an absolute path, like from "C:\Things\Folder" to "Folder"
It's a bit of a hack, but you can use:
Set NasPath=C:\Things\Folder
Set NasFolder=%NasPath%
:GetFolder
Set GetFolderTemp=%NasFolder:*\=%
If Not %GetFolderTemp%==%NasFolder% (
Set NasFolder=%GetFolderTemp%
Goto :GetFolder
)
Echo NasPath =%NasPath%
Echo NasFolder=%NasFolder%
Exit /B
Whatever you do, don't put quotes around any part of the Set NasPath=... statement. Use quotes this way:
Set FromPath=C:\Program Files\Blah
Set NasPath=C:\Things\Folder
RoboCopy "%FromPath%" "%NasPath%"
Do not use quotes this way:
Set FromPath="C:\Program Files\Blah"
Set NasPath="C:\Things\Folder"
RoboCopy %FromPath% %NasPath%
To not have any issue with space, I propose this code:
Set NasPath=C:\Things\My Space\Folder
Set GetFolderTemp=%NasPath%
:GetFolder
FOR /F "tokens=1,* delims=\" %%1 IN ("%GetFolderTemp%") do (
set NasFolder=%%1
set GetFolderTemp=%%2
)
if not "a%GetFolderTemp%"=="a" goto :GetFolder
echo %NasFolder%
Assuming C:\Program Files\Mickey\Mouse-like paths (without quotes), you could also use the following code:
setlocal EnableDelayedExpansion
set path=C:\Program Files\Microsoft\Mickey\Mouse
:shift
for /f "tokens=1* delims=\/" %%i in ( "!path!" ) do (
set folder=%%i
set path=%%j
)
if not [!path!] == [] goto :shift
echo folder: !folder!
endlocal

Resources