Rob van der Woude's Scripting Pages

An "extreme" batch file

Convert IE Favorites to Netscape Bookmarks

Note: This batch file is showing its age. It was created for MS-DOS and Windows 9x back when Windows NT 4 was only just beginning its conquest of the corporate PCs.
Don't expect it to work on Windows NT 4, 2000, XP or Server 2003 without modifications.
In fact there is no need to use these ancient techniques in the "modern" Windows versions, as CMD.EXE has much more powerful string parsing features with its FOR /F command.

As an example of the techniques discussed here, we'll set up a batch file to convert MS Internet Explorer "favorites" files to a single Netscape "bookmark" file.

Consider the format of IE's "favorites" files.
Every "favorite" URL is stored in a separate file named after that same URL, and containing two or more lines:

[InternetShortcut]
URL=http://www.redhat.com/support/docs/rhl/intel/rh51-hardware-intel.html
Modified=C0357FC608BBBD01BB

Now let's have a look at the way Netscape stores its "favorites" or "bookmarks".
They are stored together in one single HTML file called BOOKMARK.HTM:

<!DOCTYPE NETSCAPE-Bookmark-file-1>
<!-- This is an automatically generated file.
It will be read and overwritten.
Do not edit! -->
<TITLE>'s Bookmarks</TITLE>
<H1>'s Bookmarks</H1>

<DL>    <p>
<DT><A HREF="http://www.redhat.com/index.html" ADD_DATE="907880848" LAST_VISIT="907880843" LAST_MODIFIED="907880843">Red Hat Linux</A>
</DL>   <p>

First we'll have to isolate the line starting with "URL=" from IE's "favorite".
To that end we'll use the FIND command:

TYPE "Red Hat Linux.URL" | FIND "URL="

This will show the next line on screen:

URL=http://www.redhat.com/index.html

Our next step is to remove the string "URL=" from the actual URL.
To that end we'll first redirect the "URL=" line to one temporary batch file, named TEMP1.BAT:

TYPE "Red Hat Linux.URL" | FIND "URL=" > TEMP1.BAT

We need a second temporary batch file, named URL.BAT, to split that URL line in two and store the resulting string in a variable:

@ECHO OFF
SET URL=%1

How can this batch file remove "URL=" from a line?
It does so because DOS' command interpreter ignores the "=" in the command and replaces it with a space.
So DOS reads the line "URL=http://..." as "URL http://..."

Note: DOS only ignores the "=" if it is the last character of the command, not if it is located within the parameters string!

Now comes a hard part: instead of creating this second temporary batch file once and keeping it in the same directory or in a path directory, we'll let our primary batch file create both temporary batch files the moment it needs them.

ECHO @ECHO OFF>URL.BAT
ECHO SET URL=%%1>>URL.BAT

As you can see, both lines of the original batch file are now preceded by "ECHO ", the "%" is replaced by "%%" and ">URL.BAT" was attached to the end of the first line, and ">>URL.BAT" to the second line.
Just echoing the lines and then redirecting them to URL.BAT is not enough. That way, "%1" would not be redirected literally, but it would be interpreted first.
Adding an extra "%" prevents interpretation of "%1", so that a it will be redirected to URL.BAT.
Only when URL.BAT executes will "%1" be interpreted.

Combining the different techniques we found so far, our batch file now looks like this:

@ECHO OFF
TYPE "Red Hat Linux.URL" | FIND "URL=" > TEMP1.BAT
ECHO @ECHO OFF>URL.BAT
ECHO SET URL=%%1>>URL.BAT
CALL TEMP1.BAT
PROMPT $LA HREF="%URL%"$GRed Hat Linux.URL$L/A$G
%COMSPEC% /C >> BOOKMARK.HTM

It will add the next line to BOOKMARK.HTM:

<A HREF="http://www.redhat.com/index.html">Red Hat Linux.URL</A>

Now let's create BOOKMARK.HTM's header first:

PROMPT $L!DOCTYPE NETSCAPE-Bookmark-file-1$G
%COMSPEC% /C >> BOOKMARK.HTM
PROMPT $L!-- This is an automatically generated file.
%COMSPEC% /C >> BOOKMARK.HTM
PROMPT It will be read and overwritten.$_Do not edit! --$G
%COMSPEC% /C >> BOOKMARK.HTM
PROMPT $LTITLE$G's Bookmarks$L/TITLE$G
%COMSPEC% /C >> BOOKMARK.HTM
PROMPT $LH1$G's Bookmarks$L/H1$G
%COMSPEC% /C >> BOOKMARK.HTM
PROMPT $_$LDL$G$LP$G
%COMSPEC% /C >> BOOKMARK.HTM

Next we need to add the bookmarks:

SET PROMPT=    $LDT$G$LA HREF="%URL%"$G%1$L/A$G
%COMSPEC% /C >> BOOKMARK.HTM

Note that we use "%1" for the URL's description now. "%1" is the file name of the IE "favorite". This leaves an annoying ".URL" at the end of the URL's description. I am interested in any suggestions to remove it without the need for external utility programs.
Note, too, that the bookmarks we place will not contain any ADD_DATE, LAST_VISIT or LAST_MODIFIED entries in the tag.
It would be fairly easy to add the LAST_MODIFIED entry, using the same techniques we used to retrieve the URL from IE's "favorite" file, but I'll leave that to you for a rainy day.

To close BOOKMARK.HTM after all bookmarks have been added, we need one more line at the end:

PROMPT $L/DL$G$Lp$G
%COMSPEC% /C >> BOOKMARK.HTM

To finish our project take a look at the sources of all batch files involved.
CNVRTURL.BAT is the main batch file that should be called from the command line; ADDURL.BAT is a secondary batch file called from within CNVRTURL.BAT.
CVTURLNT.BAT is the same batch file adapted for Windows NT and converted into one single file.
CV2URLNT.BAT is a more recent update to the Windows NT version, using escape characters instead of the PROMPT command to display < and > characters.

Click to view source CNVRTURL.BAT
Click to view source ADDURL.BAT
Click to view source CVTURLNT.BAT
Click to view source CV2URLNT.BAT
Click to download the ZIPped sources CNVRTURL.ZIP

If you like to experiment, you could try to integrate ADDURL.BAT into CNVRTURL.BAT, using the same techniques we used to integrate URL.BAT into ADDURL.BAT. Don't forget to check URL.BAT if you do, because it will have to be generated by a batch file that was itself generated by another batch file.
Depending on your operating system and its configuration you may need to adjust the part of CNVRTURL.BAT located before the :Header label, since different operating systems use different default directories and have different ways of handling long file names.
Besides that, I have not yet found a way to display the prompt that would work in every operating system, so you may have to experiment.
But after reading and understanding the current page, and maybe some of the other pages on this and other web sites, that shouldn't pose much of a challenge anymore.
Consider yourself an expert!

I hope you enjoyed this project as much as I did!


page last modified: 2011-03-04; loaded in 0.0059 seconds