Tengo un script VBS que borra todo del menú inicio y lo vuelve a agregar desde cero. Lo uso como script de inicio de sesión en un dominio. Pero la semana pasada me di cuenta de que algunas personas usan diferentes aplicaciones y esas aplicaciones no están en un recurso compartido central, por lo que mi pregunta es si es posible excluir ciertas carpetas de la eliminación de este script.
Dim objShell, strCmd, intRunError, strFolder, objFileSys
Set objShell = CreateObject( "WScript.Shell" )
appDataLocation=objShell.ExpandEnvironmentStrings("%APPDATA%")
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(appDataLocation & "\Microsoft\Windows\Start Menu\Programs")
' delete all subfolders and files
For Each f In folder.SubFolders
On Error Resume Next
name = f.name
f.Delete True
Next
' delete all files in root folder
for each f in folder.Files
On Error Resume Next
name = f.name
f.Delete True
Next
Set objFileSys = CreateObject("Scripting.FileSystemObject")
objFileSys.GetFolder("\\test\dfstest\Start Menu\programs").Copy appDataLocation & "\Microsoft\Windows\Start Menu\Programs"
Set objFileSys = Nothing
Editar:¿El tipo no coincide?
Dim objShell, strCmd, intRunError, strFolder, objFileSys
Dim Exceptions()
Dim Exception
Dim i
Set objShell = CreateObject( "WScript.Shell" )
appDataLocation=objShell.ExpandEnvironmentStrings("%APPDATA%")
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(appDataLocation & "\Microsoft\Windows\Start Menu\Programs")
Exception(0) = appDataLocation & "\Microsoft\Windows\Start Menu\Programs\Access 2013"
Exception(1) = appDataLocation & "\Microsoft\Windows\Start Menu\Programs\Cameleon"
For Each sf in MyFolder.SubFolders
Exception = False
For i = LBound(Exceptions) to UBound(Exceptions)
If lCase(sf.Path) = lCase(Exceptions(i)) Then
Exception = True
Exit For
End If
Next
If Not Exception Then
deleteSubFolders
sf.Delete
End If
Next
Public Sub deleteSubFolders(byRef MyFolder, exclFolder)
Dim sf
For Each sf in MyFolder.SubFolders
If not (lCase(sf.Path) = lCase(exclFolder)) Then
deleteSubFolders sf, exclFolder
sf.Delete
End If
Next
End Sub
' delete all files in root folder
for each f in folder.Files
On Error Resume Next
name = f.name
f.Delete True
Next
Set objFileSys = CreateObject("Scripting.FileSystemObject")
objFileSys.GetFolder("\\test\dfstest\Start Menu\programs").Copy appDataLocation & "\Microsoft\Windows\Start Menu\Programs"
Set objFileSys = Nothing
Respuesta1
Para múltiples condiciones, puede usar, por ejemplo, una matriz y un bucle para verificarlas todas:
Dim Exceptions(10) as String
Dim Exception as Boolean
Exception(0)= appDataLocation & "\Microsoft\Windows\Start Menu\Programs\Access 2013"
Exception(1)=...
...
Exception(9)=...
...
For Each sf in MyFolder.SubFolders
Exception = False
For i = LBound(Exceptions) to UBound(Exceptions)
If lCase(sf.Path) = lCase(Exceptions(i)) Then
Exception = True
Exit For
End If
Next i
If Not Exception Then
deleteSubFolders sf, exclFolder
sf.Delete
End If
Next sf
(Tengo más experiencia con VBA y tampoco pude probarlo, por lo que es posible que no funcione sin pequeñas correcciones, solo lo escribí para explicar mi idea)