User Tools

Site Tools


vbs:bulkshortcutrebuild

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Last revisionBoth sides next revision
vbs:bulkshortcutrebuild [2014/04/29 12:59] – created gfsadministratorvbs:bulkshortcutrebuild [2014/04/29 13:03] gfsadministrator
Line 1: Line 1:
-====== Localhost Info ====== +====== Bulk Shortcut Rebuild ====== 
-Ottiene le informazioni sulla scheda di rete ed eventuale adapter VPN restituendo i due IP interni e il nome macchina. Lo script originale è disponibile all'indirizzo [[http://community.spiceworks.com/topic/post/1612511|community.spiceworks.com/topic/post/1612511]]+Modifica il puntamento dei collegamenti alle cartelle di rete presenti sul Desktop. Accetta parametri via batch (vedi primo blocco codice). Lo script di partenza è disponibile all'indirizzo [[http://community.spiceworks.com/scripts/show/298-change-shortcut-lnk-target-paths-in-bulk|community.spiceworks.com/scripts/show/298-change-shortcut-lnk-target-paths-in-bulk]], modifiche e funzionamento spiegato sul blog all'url #
  
-<file vb localhostinfo.vbs> +Richiamo del VBS tramite batch:
-dim NIC1, Nic, StrIP, CompName +
-Set NIC1 = GetObject("winmgmts:").InstancesOf("Win32_NetworkAdapterConfiguration"+
-For Each Nic in NIC1 +
-if Nic.IPEnabled then +
-StrIP = Nic.IPAddress(i) +
-CompName = WshNetwork.Computername +
-Dim WMI, Configs, Config, Adapters, Adapter +
-Set WMI = GetObject("winmgmts:{impersonationlevel=impersonate}root/cimv2"+
-Set Configs = WMI.ExecQuery("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled=True"+
-For Each Config In Configs +
-Set Adapters = WMI.AssociatorsOf("Win32_NetworkAdapterConfiguration.Index=" & Config.Index, "Win32_NetworkAdapterSetting"+
-For Each Adapter In Adapters +
-VPNIP = Config.IPAddress(0) +
-Next +
-Next +
-MsgBox "IP Address: "&StrIP & vbNewLine _ +
-& "VPN IP Address: "&VPNIP & vbNewLine _ +
-& "Computer Name: "&CompName ,4160,"IP Address and Computer Name" +
-wscript.quit +
-end if+
  
-next+<code>cscript \\%USERDNSDOMAIN%\netlogon\scripts\BulkShortcut.vbs //B "\\SERVER1\" "\\SERVER3\shared\" 
 +cscript \\%USERDNSDOMAIN%\netlogon\scripts\BulkShortcut.vbs //B "\\SERVER2\" "\\SERVER3\shared\"</code> 
 + 
 +<file vb BulkShortcut.vbs> 
 +' MODIFICA IN BULK DEGLI SHORTCUT 
 +' Codice originale : Rob Dunn 
 +' Modificato da : GSolone 
 +' Ultima modifica : 29-04-2014 (rev1) 
 +' ------------------------------------------------------------------- 
 +' MODIFICHE 
 +' rev1- ho rimosso i popup di richiesta dati e messo di default il parametro Silent a 2 così da non richiedere l'intervento dell'utente. Ho inserito l'objArgs così da potergli passare i parametri direttamente da un batch (logon) 
 + 
 +Dim Silent, CurTime, sIsDrive 
 +Dim newlink, oldlink, oldfull, fullname, oldfile, bgcolor 
 +Dim CheckFolder, RootFolder 
 +Dim w, ws 
 +const ForReading = 1 
 +const ForWriting = 2 
 +const ForAppending = 8 
 + 
 +'On Error Resume Next 
 + 
 +'Find current time that the script runs 
 +set wso = CreateObject("Wscript.Shell"
 +set fso = CreateObject("Scripting.FileSystemObject"
 + 
 +'objArgs per passargli i parametri da batch 
 +Set objArgs = WScript.Arguments 
 + 
 +'pull the system's process variables (we'll be using TEMP 
 +' for the output file and WINDIR to figure out the default  
 +' location of user's desktop folder - whether 9x or NT/2k/XP) 
 +Set WshSysEnv = wso.Environment("PROCESS"
 + 
 +'pull the system's profile environment variable 
 +userprofile = wso.ExpandEnvironmentStrings("%userprofile%"
 + 
 +'set your variables here 
 +'silent = 0/1/2 
 +' 0 - verbose 
 +' 1 - turns off verification prompts 
 +' 2 - turns off verification and initial config prompts 
 +'ChangePathFrom = string you wish to replace 
 +'ChangePathTo = string you wish to change ChangePathFrom to 
 +' above server vars are needed only for when silent = 2 
 +'ouputfile = location of output filename, you can use a string in 
 +' place of all the code after the equal sign (i.e.  
 +' outputfile = "x:\temp," etc.) 
 +'curtime = finds time of execution of script 
 +'RootFolder = The folder that you wish to search (silent mode only) 
 +'-------------------------------------------------------------------- 
 +     set your variables below... 
 +'-------------------------------------------------------------------- 
 +Silent = 2 
 +ChangePathFrom = objArgs(0) 
 +ChangePathTo = objArgs(1) 
 +OutputFile = WshSysEnv("TEMP") & "\" & "BulkShortcut.htm" 
 +RootFolder = objArgs(2) 
 +'-------------------------------------------------------------------- 
 + 
 +CurTime = Now 
 +OSType = WshSysEnv("OS"
 +WinDirectory = WshSysEnv("WINDIR"
 + 
 +  
 +If Silent > 0 Then 
 + CheckFolder = RootFolder 
 +Else 
 + 
 +End If 
 + 
 +If CheckFolder = "" Then 
 +  
 +  If OSType <> "Windows_NT" Then 
 + 'Windows 9x/Me desktop folder 
 + CheckFolder = Windirectory & "\desktop"  
 +  Else 
 + 'Windows NT/2k/XP desktop folder 
 + CheckFolder = userprofile & "\desktop" 
 +  End If 
 +End If 
 + 
 +'check to see if ouputfile exists or not, deletes it if it does 
 +If CheckFileExists(OutputFile) Then 
 + Set oldfile = fso.GetFile(OutputFile) 
 + oldfile.Delete 
 +Else 
 + 'wscript.echo oldfile & " does not yet exist." 
 +End If 
 + 
 +'Start writing the HTM Log file... 
 +Set w = fso.OpenTextFile (OutputFile, ForAppending, True) 
 + w.Writeline ("<html>"
 + w.Writeline ("<title>Changing Shortcuts in root folder "_ 
 + & CheckFolder & "</title>"
 + w.Writeline ("<table BORDER=0 width=100% cellspacing=0 cellpadding=3>"
 + w.Writeline ("<tr>"
 + w.Writeline ("<th bgcolor=#000080 colspan=3 width=100>"
 + w.Writeline ("<p align=left>"
 + w.Writeline ("</th>"
 + w.Writeline ("</tr>"
 + w.Writeline ("<h0><B><font face=Arial color=#000033 size=2>"
 + & "Shortcuts located in: <font color=#CC0000> "_ 
 + & CheckFolder & " <font face=Arial color=#000033 size=2>,"
 + & " searching recursively at " & CurTime & "</B></font></h0>"
 + w.WriteLine ("<TR bgcolor=gray colspan=3 width=100>"
 + w.WriteLine ("<TD><font face=Arial size=1 color=white> Shortcut Path"
 + & "</font></TD>")  
 + w.WriteLine ("<TD><font face=Arial size=1 color=white> Target Path"
 + & "</font></TD>"
 + w.WriteLine ("<TD><font face=Arial size=1 color=white> Updated to"_ 
 + & "</font></TD>"
 + w.WriteLine ("</TR>"
 + 
 +If ChangePathFrom = "" Then 
 + wscript.echo "You have not specified a source string to change." 
 + Call Cserver 
 +ElseIf ChangePathTo = "" Then  
 + wscript.echo "You have not specified a new string name to"_ 
 + & " replace" & Chr(34) & ChangePathFrom & Chr(34) & " with." 
 + Call Nserver 
 +ElseIf CheckFolder = "" Then 
 + wscript.echo "You must specify a root folder to begin your"
 + & " search from." 
 + Call CFolder 
 +End If 
 + 
 +'process the shortcuts 
 +ModifyLinks CheckFolder 
 + 
 +Sub ModifyLinks (foldername) 
 + 
 +   dim file        'for stepping through the files collection        ' 
 +   dim folder      'for stepping through the subfolders collection   ' 
 +   dim fullname    'fully qualified link file name                   ' 
 +   dim link        'object connected to the link file                ' 
 + 
 +   'process all the files in the folder 
 +   For each file in fso.GetFolder(foldername).Files 
 + 
 +     'check only link files 
 +     If strcomp(right(file.name,4),".lnk",vbTexctCompare) = 0 then 
 + 
 +         'Find full path of shortcut 
 +         fullname = fso.GetAbsolutePathName(file) 
 + 
 +         'Find full path of target within shortcut 
 +         set link = wso.CreateShortcut(fullname) 
 +         targetpath = LCase(link.targetpath) 
 +          
 +         oldfull = fullname 
 + oldlink = targetpath 
 +  newlink = "Not Updated" 
 +   
 + 'Displays current shortcut that is being checked (good for 
 + ' troubleshooting the script). 
 + 'If Silent = 0 Then  
 + 'MsgBox "Checking shortcut: " & fullname & "." & VBCrlf_ 
 + '& "Shortcut target: " & targetpath 
 + 'End If 
 +  
 +    'If the current server (one you want to change) is found in the 
 +    ' target path, then run the following code 
 +    If InStr(1, targetpath, ChangePathFrom) > 0 Then  
 + sChangeTargetTo = "" 
 + sChangePathTo = "" 
 +  
 + 'Set numerical length of full target path 
 + VarLengthPath = Len(targetpath) 
 + 'Set numerical length of ChangePathFrom 
 + VarLengthCPF = Len(ChangePathFrom) 
 +  
 + 'Find out what's between character 0 and where changepathfrom starts 
 + VarBeginPath = InStr(1, targetpath, ChangePathFrom) 
 +  
 + 'Subtract 1 from where it begins (all text begins at 1 in a string) 
 + 'This is so you will have a '0' value if you type in a root drive or  
 + 'UNC to replace - there shouldn't be anything that appears before  
 + ''c:\' or '\\server' etc. 
 + VarBeginPath = VarBeginPath - 1 
 +  
 + 'Parse actual text prior to search string to replace 
 + BeginPath = Null 
 + BeginPath = Left(targetpath, VarBeginPath) 
 +  
 + 'wscript.echo "VarBeginPath is: " & VarBeginPath & " " & BeginPath 
 + 
 + 'Find out how many characters are left after subtracting the beginpath  
 + 'and search strings from the whole path 
 + VarEndPath = VarLengthPath - (VarBeginPath + VarLengthCPF) 
 +         
 + 'Find out what text appears after the search string 
 + EndPath = Right(targetpath, VarEndPath) 
 + 'wscript.echo EndPath 
 +         
 +        workingpath = link.workingdirectory 
 +         
 + 'Set variable to text before/search string/text after, so you get 
 + 'something like: c:\stuffbeforestring\mysearchstring\stuffafterstring 
 + 'or c:\temp\docs\mysearchstring\test.doc 
 +        sChangePathTo = BeginPath & ChangePathTo & EndPath 
 +        'wscript.echo "ChangePathTo is: " & ChangePathTo 
 +  
 + 'If there is no working directory, then text will show 'not set' during 
 + 'script execution 
 + If workingpath = "" Then 
 + workingpath = "not set" 
 + End If 
 + 
 +  
 + 'if you are running in verbose mode, you will be prompted with 
 + 'each shortcut and working folder. 
 + If Silent = 0 Then 
 + MyVar = MsgBox ("Path contains " & Chr(34) & ChangePathFrom & "." & Chr(34) & ""
 + & "  LNK file's full target path is: "_ 
 + & targetpath & "." & "  Working path is "_ 
 + & workingpath & ".",64, fullname) 
 + End If 
 +  
 + 'Sometimes shortcuts don't have working dirs (not sure why) 
 + 'If there is a working dir, then run following code 
 + If workingpath <> "not set" Then  
 +  
 + VarBeginPath = InStr(1, workingpath, ChangePathFrom) 
 + If VarBeginPath > 0 Then 
 + VarBeginPath = VarBeginPath - 1 
 + End If 
 +  
 + 'Parse actual text prior to search string to replace 
 + BeginPath = Null 
 + 'wscript.echo "VarBeginPath " & VarBeginPath 
 + BeginPath = Left(workingpath, VarBeginPath) 
 + 'wscript.echo "Working beginpath is: " & BeginPath 
 +  
 + 'Set numerical length of working directory 
 + VarLengthWorking = Len(link.workingdirectory) 
 +  
 + VarEndPath = VarLengthWorking - (VarBeginPath + VarLengthCPF) 
 + 'wscript.echo "Working path number count is: " & varlengthworking & ""
 + '& VBCRLF & "working path end  
 + 'wscript.echo "VarEndPath = " & VarEndPath & " = " & VarLengthWorking & ""
 + '& " - (" & VarBeginPath & " + " & VarLengthCPF & ")" 
 + 'Find out what text appears after the search string 
 +  
 + If VarEndPath >= 0 Then 
 + EndPath = Right(workingpath, VarEndPath) 
 + sChangeTargetTo = BeginPath & ChangePathTo & EndPath 
 + 
 + 'wscript.echo "ChangeTargetTo is: " & sChangeTargetTo 
 + WorkingMSG = "Also change working directory to " & sChangeTargetTo & "?" 
 + End If 
 +  
 + 'wscript.echo "End of working folder :" & EndPath 
 + 
 + Else 
 + link.workingdirectory = "" 
 + WorkingMSG = "No working directory will be set at this time." 
 + End If 
 +  
 + 'wscript.echo "Path of shortcut is " & targetpath & ""
 + '& VBCRLF & " Working folder is " & workingpath & "." 
 +  
 + 'Display input box to modify each shortcut as the script finds them 
 + If Silent = 0 Then 
 + ModifyPath = InputBox ("Modifying " & fullname & "." & VBCRLF & ""
 + & VBCRLF & "Modify path for " & targetpath & " "_ 
 + & "and replace with " & sChangePathTo & "?" & VBCRLF & VBCRLF & ""
 + & WorkingMSG,""
 + & "Type 'yes' to modify"
 +  ElseIf Silent >= 1 Then  
 +  ModifyPath = "yes" 
 +  End If  
 +  If ModifyPath = "yes" Then 
 + bgcolor = "#99CCFF" 
 + 'Set link target path attribute to  
 + link.targetpath = Chr(34) & sChangePathTo & Chr(34) 
 +  
 + newlink = link.targetpath 
 + 
 +         'wscript.echo newlink 
 +         If VarLengthWorking <> "" Then 
 + 'Set link working dir attribute to  
 + ' \\ChangePathToname\workingpath 
 + link.workingdirectory = Chr(34) & sChangeTargetTo & Chr(34) 
 + End If 
 + 
 + 'Save the shortcut with the new information 
 + link.save 
 +  
 + 'If answer above is anything but yes, the script will proceed  
 + ' to the next shortcut 
 +  
 + Else 
 + 
 + End if 
 +  
 + 'Clear link variable 
 +      MyPos = 0 
 +      MyPosEnd = 0 
 +      End if 
 +       
 +      'write output to logfile 
 +      Call WriteEntry    
 +End If 
 + 
 +   Next 
 + 
 +   'process all the subfolders in the folder 
 +   For each folder in fso.GetFolder(foldername).Subfolders 
 +      call ModifyLinks(folder.path) 
 + 
 +   Next 
 +End Sub 
 + 
 +'-------------------------------------------------------------------------- 
 +' Function WriteEntry to write change history to logfile in outputfile path  
 +'-------------------------------------------------------------------------- 
 + 
 +Function WriteEntry 
 +   If newlink <> "0" Then 
 + w.WriteLine ("<TR bgcolor=" & Chr(34) & bgcolor & Chr(34) & ">"
 + w.WriteLine ("<TD><font face=Arial color=#000033 size=1>" & ""
 + & oldfull & "</font></TD>")  
 + w.WriteLine ("<TD><font face=Arial color=#000033 size=1>" & ""
 + & oldlink & "</font></TD>"
 + w.WriteLine ("<TD><font face=Arial color=#000033 size=1>" & ""
 + & newlink & "</font></TD>"
 + w.WriteLine ("</TR>"
 +   oldfull = "0" 
 +   newlink = "0" 
 +   oldlink = "0" 
 +   bgcolor = "white" 
 +   End If 
 +End Function 
 + 
 +'---------------------------------------------------------------------------- 
 +'Function to see if outputfile already exists 
 +'---------------------------------------------------------------------------- 
 + 
 +Function CheckFileExists(sFileName) 
 + 
 +Dim FileSystemObject 
 +Set FileSystemObject = CreateObject("Scripting.FileSystemObject"
 +If (FileSystemObject.FileExists(sFileName)) Then 
 + CheckFileExists = True 
 +Else 
 + CheckFileExists = False 
 +End If 
 +Set FileSystemObject = Nothing 
 +End Function 
 + 
 +w.Writeline ("</html>"
 + 
 +'if silent = 2, then it will not open the log file 
 +If Silent <= 1 Then 
 + 'set command variable with path in quotes (for long filenames) 
 + Command = Chr(34) & OutputFile & Chr(34) 
 +  
 + 'run htm file in your default browser 
 + wso.Run Command 
 +End If
 </file> </file>