Converting NAL AXT to CMD files

It's now been a decade since I've supported Zenworks in a commercial environment... it really was a gret product.  There was no PowerShell and every engineer used a bag full of DOS type utilities to overcome limitations with supporting machines.  

It was a real surprise to hear of a colleague needing to convert Zenworks SnapApps for a modern rollout.  Installshield (if you have a license) can / could convert Netware AXT files but the quality of the MSI produced was poor.  It was far cleaner to create a standalone installer that could be recaptured independently on a clean system.

The script below is extremely old and if I had a need to convert AXT files again I'd take the time to PowerShell it up & bring it into the modern age.  That said, there are not many resources available for techs to leverage when dealing with such old technology.  In that spirit, the script may be of use to some.

As always, it's far better to use a vendor supplied, modern installer when capturing for a new Operating System release... only when that isn't an option (and ofter original installers have been lost) does AXT conversion become a sensible approach.

 

[[vb]]
' **************************
' NAL AXT Conversion to CMD
' Laurie Rhodes 2003
'
' Requires NAL directory to be writeable
' Uses nircmd for batch operations http://www.nirsoft.net/utils/nircmd.html

' ***************************

set FSO=Wscript.CreateObject("scripting.FileSystemObject")
Set objArgs = WScript.Arguments


'****************************************
'Script 
'**************************************** 
AXTLocation =""
NALdir =""

'See if the script has been called with parameters
For I = 0 to objArgs.Count - 1
    StartParams=objArgs(I)
    StartParams=ucase(StartParams)
    if right(StartParams,4)=".AXT" then
        AXTLocation =  objArgs(I)
    end if    
Next


'Select the AXT for conversion
'Only produce a GUI if AXT parameters have not already been passed 
if AXTLocation ="" Then
    msgbox "Select the AXT File for Validation"
    AXTLocation = fBrowseForFile 
else     
End if

NALdir = Left(AXTLocation, instrrev(AXTLocation, "\")) 

Set file = fso.OpenTextFile(AXTLocation, 1,,0) 'file for read as ANSI
Set outfile = fso.OpenTextFile(NALDIR &"~Output.txt", 2,1,0) 'file for write


'First we are goint to tag each of the lines within the axt to identify what function it represents    
Do While Not file.AtEndofStream 'Lets read the axt
    FileLine = file.Readline
'    msgbox fileline
    If instr(FileLine,"[") = 1 then
        varTag= FileLine
    else
        if FileLine ="" then 
        else
          Fileline = Vartag &fileline
        end if
    end if 

    outfile.writeline(fileline) 
Loop

outfile.close
file.close

'Now we are going to open our resulting file and piece together the Registry editing instructions 
Set file = fso.OpenTextFile(NALDIR &"~Output.txt", 1,,0) 'file for read as ANSI
Set outfile = fso.OpenTextFile(NALDIR &"~Output2.txt", 2,1,0) 'file for write

        variableType =""    'Reset our variables for the next registry block 
        varName=""
        varValue=""
        varkey=""
        

Do While Not file.AtEndofStream 'Lets read the file
    FileLine = file.Readline
    'msgbox fileline 
  If instr(FileLine,"[Registry Value Create]") = 1 then 'we know it's a Registry creation section
  
    If instr(FileLine,"[Registry Value Create]Type=") = 1 then 'It is a data Type we need to change 
                                                                'The format of Data type
        variableType = right(FileLine,len(FileLine)-28)
        If instr(variableType,"DWORD") = 1 then
           variableType = "DWORD" 
        end if
        If instr(variableType,"String") = 1 then
           variableType = "SZ" 
        end if
        If instr(variableType,"Binary") = 1 then
           variableType = "BINARY" 
        end if
        If instr(variableType,"Default") = 1 then
           variableType = "SZ"
        end if
    end if 

  If instr(FileLine,"[Registry Value Create]Key") = 1 then
        varKey = right(FileLine,len(FileLine)-27)           'If this is a key
                                                            'We have to convert the long notation 
                                                            'of Registry roots into short form
        If instr(varKey,"HKEY_LOCAL_MACHINE") = 1 then
           varkey = "HKLM" &right(varkey,len(varkey)-18) 
        end if
        If instr(varKey,"HKEY_CURRENT_USER") = 1 then
           varkey = "HKCU" &right(varkey,len(varkey)-17)
        end if
        If instr(varKey,"HKEY_CLASSES_ROOT") = 1 then 
           varkey = "HKCR" &right(varkey,len(varkey)-17)
        end if
        If instr(varKey,"HKEY_CURRENT_CONFIG") = 1 then
           varkey = "HKCC" &right(varkey,len(varkey)-19) 
        end if
        If instr(varKey,"HKEY_USERS") = 1 then
           varkey = "HKU" &right(varkey,len(varkey)-10)
        end if        
    
   end if
   
    If instr(FileLine,"[Registry Value Create]Name") = 1 then 
        varName = right(FileLine,len(FileLine)-28)
    end if
    
    If instr(FileLine,"[Registry Value Create]Value") = 1 then ' Possible multi - line if binary type 
        tempvar = right(FileLine,len(FileLine)-29)
        if varValue = "" then 'If preexisting value set for varvalue then 
            varValue = tempvar 
        else
            varValue = varValue=varValue &" " &tempvar 
        end if
    end if
  end if        

    if Fileline = "" then  'now we start manipulating the results

        
        if varkey =""      then'all valid entries must have a registry key 
            'no key exists
        else
            if variableType ="" then
              variableType = "sz"
            end if
            Actionline = "nircmd regsetval " &variableType &" " &chr(34) &varKey &chr(34) &" " &chr(34) &varname &chr(34) &" "    &chr(34) &varValue &chr(34) &" "    
        end if
        

        'we should now have a valid reg string for a batch file.    
        
        If Actionline="" then 'ignore any blank lines
        else    
         if lastActionLine=ActionLine then 'make sure the last line isn't duplicated 
         else                                'for every line in the source file
         outfile.writeline(ActionLine)         
         end if
        end if
        
        lastActionLine=ActionLine 
        
        
        variableType =""    'Reset our variables for the next registry block
        varName=""
        varValue=""
        varkey=""
    end if 
loop

outfile.close
file.close

'We have now successfully converted all of the registry entrys from the NAL
'We have to account for the remaining NAL categories

Set file = fso.OpenTextFile (NALDIR &"~Output.txt", 1,,0) 'file for read as ANSI
Set outfile = fso.OpenTextFile(NALDIR &"~Output2.txt", 8,1,0) 'file for write (Appending this time)

'
'Let's do the INI additions 
'

Do While Not file.AtEndofStream 'Lets read the file
    FileLine = file.Readline
    'msgbox fileline
    If instr(FileLine,"[INI Identifier Create]") = 1 then 
        If instr(FileLine,"[INI Identifier Create]File=") = 1 then 
          varfile = right(FileLine,len(FileLine)-28)
        end if
        If instr(FileLine,"[INI Identifier Create]Section=") = 1 then 
          varSection = right(FileLine,len(FileLine)-31)
        end if
        If instr(FileLine,"[INI Identifier Create]Identifier=") = 1 then 
          varIdentifier = right(FileLine,len(FileLine)-34)
        end if  
        If instr(FileLine,"[INI Identifier Create]Value=") = 1 then 
          varValue = right(FileLine,len(FileLine)-29)
        end if  
    end if
    Actionline = "nircmd inisetval " &chr(34) &varfile &chr(34) &" " &chr(34) &varSection &chr(34) &" "  &chr(34) &varIdentifier &chr(34) &" "     &chr(34) &varValue &chr(34) 

    'we have come to an end of a section so it's time to write the 
    'Action Command
    if Fileline = "" then 
        if varfile =""      then 'we haven't finished an ini section, carry on with script 

'        If Actionline="" then 'ignore any blank lines
        else    
'         if lastActionLine=ActionLine then 'make sure the last line isn't duplicated
'         else                                'for every line in the source file 
        'IF Varname ="" then
        'else
        if varvalue ="" then 'make sure that only a correct ini entry is attempted to be written
        else
         outfile.writeline (ActionLine)         
'         end if
        'end if
        'end if
        end if
        lastActionLine=ActionLine
            
        varfile =""    'Reset our variables for the next iteration 
        varSection=""
        varIdentifier=""
        varValue=""
        end if
    end if
Loop

outfile.close
file.close


Set file = fso.OpenTextFile(NALDIR &"~Output.txt", 1,,0) 'file for read as ANSI 
Set outfile = fso.OpenTextFile(NALDIR &"~Output2.txt", 8,1,0) 'file for write (Appending this time)

'
'Let's Create Directories
'

Do While Not file.AtEndofStream 'Lets read the file 
    FileLine = file.Readline
    If instr(FileLine,"[Directory Create]") = 1 then 
        If instr(FileLine,"[Directory Create]Directory=") = 1 then 
          varDirectory = right(FileLine,len(FileLine)-28) 
        end if
    end if
    
    

    Actionline = "nircmd execmd mkdir " &chr(34) &varDirectory &chr(34) 

    'we have come to an end of a section so it's time to write the 
    'Action Command
    if Fileline = "" then 
        if varDirectory =""      then 'we haven't finished a valid section, carry on with script

'        If Actionline="" then 'ignore any blank lines 
        else    
'         if lastActionLine=ActionLine then 'make sure the last line isn't duplicated
'         else                                'for every line in the source file
          outfile.writeline(ActionLine)         
'         end if
        'end if
        
        lastActionLine=ActionLine
            
        varDirectory =""    'Reset our variables for the next iteration 

        end if
    end if
Loop




outfile.close
file.close


Set file = fso.OpenTextFile(NALDIR &"~Output.txt", 1,,0) 'file for read as ANSI
Set outfile = fso.OpenTextFile (NALDIR &"~Output2.txt", 8,1,0) 'file for write (Appending this time)

'
'Let's do the Files now
'

Do While Not file.AtEndofStream 'Lets read the file
    FileLine = file.Readline
    If instr(FileLine,"[File Copy]") = 1 then 
        If instr(FileLine,"[File Copy]Source=") = 1 then 
          varSource = right(FileLine,len(FileLine)-18)
        end if
        If instr(FileLine,"[File Copy]Target=") = 1 then 
          varTarget = right(FileLine,len(FileLine)-18)
        end if
    end if
    
    

    Actionline = "nircmd execmd copy " &chr(34) &varSource &chr(34) &" " &chr(34) &varTarget &chr(34) 

    'we have come to an end of a section so it's time to write the 
    'Action Command
    if Fileline = "" then 
        if varSource =""      then 'we haven't finished a valid section, carry on with script 

'        If Actionline="" then 'ignore any blank lines
        else    
'         if lastActionLine=ActionLine then 'make sure the last line isn't duplicated
'         else                                'for every line in the source file 
         outfile.writeline(ActionLine)         
'         end if
        'end if
        
        lastActionLine=ActionLine
            
        varSource =""    'Reset our variables for the next iteration 
        varTarget=""

        end if
    end if
Loop


outfile.close
file.close


Set file = fso.OpenTextFile(NALDIR &"~Output.txt", 1,,0) 'file for read as ANSI 
Set outfile = fso.OpenTextFile(NALDIR &"~Output2.txt", 8,1,0) 'file for write (Appending this time)

'
'Let's Do Shortcuts now
'

Do While Not file.AtEndofStream 'Lets read the file 
    FileLine = file.Readline
    If instr(FileLine,"[Shortcut Add]") = 1 then 
        If instr(FileLine,"[Shortcut Add]Link File Path=") = 1 then 
          varLinkFilePath = right(FileLine,len(FileLine)-29) 
          if instr(varLinkFilePath,"\") > 0 then
          'We need to split this string into two components for nircmd to work correctly
          
          tempvar=InstrRev(varLinkFilePath,"\",-1,1) 
          varFilename=Right(varLinkFilePath, len(varLinkFilePath)-tempvar) 'we still need to get rid of the file extension
          varFilename=Left(varFilename, len(varFilename)-4)
          varLinkFilePath=Left(varLinkFilePath, tempvar-1) 
          end if      
        end if
        If instr(FileLine,"[Shortcut Add]EXE Path=") = 1 then 
          varExePath = right(FileLine,len(FileLine)-23)
        end if
        If instr(FileLine,"[Shortcut Add]Command-line=") = 1 then 
          varCommandLine = right(FileLine,len(FileLine)-27)
        end if
        If instr(FileLine,"[Shortcut Add]Icon Path=") = 1 then 
          varIconPath = right(FileLine,len(FileLine)-24)
        end if
        If instr(FileLine,"[Shortcut Add]Icon Index=") = 1 then 
          varIconIndex = right(FileLine,len(FileLine)-25)
        end if
        If instr(FileLine,"[Shortcut Add]Working Directory=") = 1 then 
          varWoringDir = right(FileLine,len(FileLine)-32)
        end if
        
        
        
    end if
    
    

    Actionline = "nircmd shortcut " &chr(34) &varExePath &chr(34) &" " &chr(34) &varLinkFilePath &chr(34) &" " &chr(34) &varFileName &chr(34) &" " &chr(34) &varLinkFileName &chr(34) &" " &chr(34) &varCommandLine &chr(34) &" " &chr(34) &varIconPath &chr(34) &" " &chr(34) &varIconIndex &chr(34) &" " &chr(34) &varWoringDir &chr(34) &" " 

    'we have come to an end of a section so it's time to write the 
    'Action Command
    if Fileline = "" then 
        if varExePath =""      then 'we haven't finished a valid section, carry on with script 

'        If Actionline="" then 'ignore any blank lines
        else    
'         if lastActionLine=ActionLine then 'make sure the last line isn't duplicated
'         else                                'for every line in the source file 
         outfile.writeline(ActionLine)         
'         end if
        'end if
        
        lastActionLine=ActionLine
            
        varFilename =""    'Reset our variables for the next iteration 
        varLinkFilePath =""    'Reset our variables for the next iteration
        varExePath =""    'Reset our variables for the next iteration
        varCommandLine =""    'Reset our variables for the next iteration 
        varIconPath =""    'Reset our variables for the next iteration
        varIconIndex =""    'Reset our variables for the next iteration
        varWoringDir =""    'Reset our variables for the next iteration 
        

        end if
    end if
Loop

outfile.close
file.close


'We have now converted everything of importance
'We have to convert the variables used in our installer script 
'We have a series of predefined variables that can be used

'msgbox "Opening Tempfile for Conversion " &NALDIR &"~Output2.txt"
Set file = fso.OpenTextFile(NALDIR &"~Output2.txt", 1,,0) 'file for read as ANSI 

strText = File.ReadAll 'read the context into memory
File.Close 'close the file so we can write over it

'now we list all of the variables we wish to change
'there will be more 
strText = Replace(strText, "%*APPDATA%\", "~$folder.appdata$\") 
strText = Replace(strText, "%*APPDATA%", "~$folder.appdata$")
strText = Replace(strText, "%*COMMONDESKTOP%\", "~$folder.common_desktop$\")
strText = Replace(strText, "%*COMMONDESKTOP%", "~$folder.common_desktop$") 
strText = Replace(strText, "%*COMMONPROGRAMS%\", "~$folder.common_programs$\")
strText = Replace(strText, "%*COMMONPROGRAMS%", "~$folder.common_programs$")

strText = Replace(strText, "%*COMMONSTARTMENU%\", "~$folder.common_start_menu$\") 
strText = Replace(strText, "%*COMMONSTARTMENU%", "~$folder.common_start_menu$")
strText = Replace(strText, "%*COMMONSTARTUP%\", "~$folder.common_startup$\")
strText = Replace(strText, "%*COMMONSTARTUP%", "~$folder.common_startup$") 
strText = Replace(strText, "%*COMMONWINDESKTOP%\", "~$folder.common_desktop$\")
strText = Replace(strText, "%*COMMONWINDESKTOP%", "~$folder.common_desktop$")

strText = Replace(strText, "%*COOKIES%\", "~$folder.cookies$\") 
strText = Replace(strText, "%*COOKIES%", "~$folder.cookies$")
strText = Replace(strText, "%*DESKTOP%\", "~$folder.common_desktop$\")
strText = Replace(strText, "%*DESKTOP%", "~$folder.common_desktop$") 

strText = Replace(strText, "%*FAVORITES%\", "~$folder.favorites$\")
strText = Replace(strText, "%*FAVORITES%", "~$folder.favorites$")
strText = Replace(strText, "%*FONTS%\", "~$folder.windows$\Fonts\") 
strText = Replace(strText, "%*FONTS%", "~$folder.windows$\Fonts")
strText = Replace(strText, "%*HISTORY%\", "~$sys.USERPROFILE$\Local Settings\History\")
strText = Replace(strText, "%*HISTORY%", "~$sys.USERPROFILE$\Local Settings\History") 

strText = Replace(strText, "%*HOMEDRIVE%\", "~$sys.HOMEDRIVE$\")
strText = Replace(strText, "%*HOMEDRIVE%", "~$sys.HOMEDRIVE$")
strText = Replace(strText, "%*HOMEPATH%\", "~$sys.HOMEPATH$\") 
strText = Replace(strText, "%*HOMEPATH%", "~$sys.HOMEPATH$")


strText = Replace(strText, "%*NETHOOD%\", "~$sys.USERPROFILE$\Nethood\")
strText = Replace(strText, "%*NETHOOD%", "~$sys.USERPROFILE$\Nethood") 
'strText = Replace(strText, "%*PERSONAL%\", "~$$\")
'strText = Replace(strText, "%*PERSONAL%", "~$$")
strText = Replace(strText, "%*PROGRAMFILES%\", "~$folder.programs$\") 
strText = Replace(strText, "%*PROGRAMFILES%", "~$folder.programs$")
strText = Replace(strText, "%*PROGRAMFILESCOMMON%\", "~$folder.common_programs$\")
strText = Replace(strText, "%*PROGRAMFILESCOMMON%", "~$folder.common_programs$") 

strText = Replace(strText, "%*RECENT%\", "~$folder.recent$\")
strText = Replace(strText, "%*RECENT%", "~$folder.recent$")
strText = Replace(strText, "%*SENDTO%\", "~$sys.USERPROFILE$\SendTo\") 
strText = Replace(strText, "%*SENDTO%", "~$sys.USERPROFILE$\SendTo")
strText = Replace(strText, "%*STARTMENU%\", "~$folder.start_menu$\")
strText = Replace(strText, "%*STARTMENU%", "~$folder.start_menu$") 
strText = Replace(strText, "%*STARTUP%\", "~$folder.startup$\")
strText = Replace(strText, "%*STARTUP%", "~$folder.startup$")
strText = Replace(strText, "%*TEMPDIR%\", "~$sys.tmp$\") 
strText = Replace(strText, "%*TEMPDIR%", "~$sys.TMP$")
strText = Replace(strText, "%*TEMPLATES%\", "~$sys.USERPROFILE$\Templates\")
strText = Replace(strText, "%*TEMPLATES%", "~$sys.USERPROFILE$\Templates") 

strText = Replace(strText, "%User_name%\", "~$sys.USERNAME$\")
strText = Replace(strText, "%User_name%", "~$sys.USERNAME$")

strText = Replace(strText, "%*WINSYSDIR%\", "~$folder.system$\") 
strText = Replace(strText, "%*WINSYSDIR%", "$folder.system$")
strText = Replace(strText, "%*WINDESKTOP%\", "~$folder.windows$\")
strText = Replace(strText, "%*WINDESKTOP%", "~$folder.windows$") 
strText = Replace(strText, "%*WINDIR%\", "~$folder.windows$\")
strText = Replace(strText, "%*WINDIR%", "~$folder.windows$")
strText = Replace(strText, "%*WINDISK%\", "C:\") 
strText = Replace(strText, "%*WINDISK%", "C:\")
strText = Replace(strText, "%*WINDOWS%\", "~$folder.windows$\")
strText = Replace(strText, "%*WINDOWS%", "~$folder.windows$") 
strText = Replace(strText, "%*WINSYSDISK%\", "C:\")
strText = Replace(strText, "%*WINSYSDISK%", "C:\")

strText = Replace(strText, "%SOURCE_PATH%\", ".\") 
strText = Replace(strText, "%SOURCE_PATH%", ".\")


'We have one more special variable to replace and that's %TARGET_PATH%

Set file = fso.OpenTextFile(NALDIR &"~Output.txt", 1,,0) 'file for read as ANSI 

Do While Not file.AtEndofStream 'Lets read the file
    FileLine = file.Readline
    If instr(FileLine,"[Macro]") = 1 then 
        If instr(FileLine,"[Macro]Name=") = 1 then 
          varName = right(FileLine,len(FileLine)-12) 
          varname = "%" &varname &"%"
        end if
        If instr(FileLine,"[Macro]Value=") = 1 then 
          varValue = right(FileLine,len(FileLine)-13)
          'varValue = left(varvalue,len(varValue)-1) 
        end if
    end if
    
    if Fileline = "" then 'We will process the section
        if varName =""      then 'we haven't finished a valid section, carry on with script 

'        If Actionline="" then 'ignore any blank lines
        else    
            'msgbox "varname = " &varname & "varvalue= " &varvalue
            strNewText = Replace(strText, varName, varValue) 
        end if
    end if
        
Loop

file.close
Set outfile = fso.OpenTextFile(NALDIR &"_Install.cmd", 2,1,0) 'file for write
outfile.WriteLine strNewText
outfile.Close 

'Let's cleanup the old working files too

If fso.FileExists(NALDIR &"~Output.txt") Then
   fso.DeleteFile(NALDIR &"~Output.txt")
end if
If fso.FileExists(NALDIR &"~Output2.txt") Then 
   fso.DeleteFile(NALDIR &"~Output2.txt")
end if

'***********************************
' Functions
'***********************************

Function fBrowseForFile() 
    Set oBrowseDialog = CreateObject(" UserAccounts.CommonDialog") 
    oBrowseDialog.Filter = "AXT Files|*.axt" 
    oBrowseDialog.InitialDir = "c:\" 
    oBrowseDialog.Flags = &H80000 + &H4 + &H8 
    oBrowseDialog.ShowOpen 
    fBrowseForFile = oBrowseDialog.FileName 
End Function
[[/vb]]