0

我正在尝试删除将从 txt 文件中读取的多个文件夹。我不知道如何让它在拉动当前登录的用户时循环遍历文本文件中的计算机。我尝试了一些代码,但经验不足,无法将其与我目前拥有的代码合并。

我有一个工作脚本,它可以从 txt 文件中的计算机列表中删除文件夹,但具有 %APPDATA% 的那些除外,等等......这就是我使用 vbscript 的原因。

请注意,除了 Windows 7 附带的软件之外,我无法使用任何软件。这消除了 psexec 等...

任何帮助将不胜感激,谢谢!

InputFile = "C:\complist.txt"
Const DeleteReadOnly = True
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFile = objFSO.OpenTextFile(InputFile)
Do While Not (objFile.AtEndOfStream)
strComputer = objFile.ReadLine
On Error Resume Next
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFolder("\\" & strComputer & "\c$\test")
objFSO.DeleteFolder("\\" & strComputer & "\c$\%APPDATA%\PGP Corporation")
objFSO.DeleteFolder("\\" & strComputer & "\c$\%LOCALAPPDATA%\PGP Corporation")
objFSO.DeleteFolder("\\" & strComputer & "\c$\%USERPROFILE%\Documents\PGP Corporation")
objFSO.DeleteFolder("\\" & strComputer & "\c$\%ALLUSERSPROFILE%\Application Data\PGP Corporation")
objFSO.DeleteFolder("\\" & strComputer & "\c$\%ALLUSERSPROFILE%\Start Menu\Programs\PGP")
objFSO.DeleteFolder("\\" & strComputer & "\c$\%CommonProgramFiles%\PGP Corporation")
objFSO.DeleteFolder("\\" & strComputer & "\c$\%ProgramFiles%\PGP Corporation")
objFSO.DeleteFolder("\\" & strComputer & "\c$\Windows\System32\config\systemprofile\AppData\Local\PGP Corporation")
Err.clean
Loop

MsgBox "Done"
4

1 回答 1

2

FileSystemObject首先,环境变量在方法中不起作用。完全没有。您需要将它们扩展为实际路径,例如:

Set sh = CreateObject("WScript.Shell")
dir = sh.ExplandEnvironmentStrings("\\" & strComputer & "\c$\%APPDATA%\PGP Corporation")
objFSO.DeleteFolder dir

此外,变量对于运行脚本的用户和系统是本地的,即上面将解析%APPDATA%您的用户在您运行脚本的系统上,而不是在指定的系统上strComputer。您需要从远程主机的注册表中读取变量,例如:

Set reg = GetObject("winmgmts://" & strComputer & "/root/default:StdRegProv")
HKLM = &h80000002
key  = "SOFTWARE\Microsoft\Windows\CurrentVersion"
vn   = "CommonFilesDir"
rc = reg.GetStringValue(HKLM, key, vn, val)
If rc = 0 Then
  commonProgramFiles = val
Else
  WScript.Echo "Cannot read value from remote registry (" & rc & ")."
End If

%ALLUSERSPROFILE%此外,某些变量(特别是)在注册表中的存储位置/方式因Windows 版本而异。在 Windows XP%ALLUSERSPROFILE%中是 2 个注册表值ProfilesDirectory和的组合AllUsersProfile,而在 Windows 7 中,它是从注册表值派生的ProgramData(都位于 中HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList)。

最后但并非最不重要的一点是,您的几个变量是特定于用户的(即%APPDATA%%LOCALAPPDATA%%USERPROFILE%,因此您需要为远程主机上的每个用户处理它们。

一种(可以说不太精确,但更直接)的方法是从远程注册表中读取配置文件文件夹的位置,然后在远程主机上处理该文件夹的所有子文件夹。

Set reg = GetObject("winmgmts://" & strComputer & "/root/default:StdRegProv")
HKLM = &h80000002
key  = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
vn   = "ProfilesDirectory"
rc = reg.GetStringValue(HKLM, key, vn, profilesDir)
If rc <> 0 Then
  WScript.Echo "Cannot read profiles directory remote registry (" & rc & ")."
  WScript.Quit rc
End If

'ugly workaround, b/c %SystemDrive% cannot be determined from the registry
profilesDir = Replace(profilesDir, "%SystemDrive%", "C$")

Set fso = CreateObject("Scripting.FileSystemObject")
For Each sf In fso.GetFolder("\\" & strComputer & "\" & profilesDir).SubFolders
  dir = fso.BuildPath(sf.Path, "Documents")
  If fso.FolderExists(dir) Then fso.DeleteFolder dir
  ...
Next
于 2013-10-30T15:26:09.977 回答