2013-10-30 30 views
0

我想删除将从txt文件中读取的多个文件夹。我不知道如何让它通过文本文件中的计算机循环,同时拉动当前登录的用户。我尝试了一些代码,但没有足够的经验将它与我目前的代码合并。如何从计算机的txt列表中远程删除%appdata%等文件夹?

我有一个工作脚本,从一个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" 
+0

可能更适合SuperUser Stackexchange。 –

+0

我相信环境变量不会在远程计算机上工作。您需要循环访问该计算机中的所有相关文件夹。您最好还是将要删除的文件夹存储在数组中,并为其添加一个循环。 – PatricK

+0

作为PatricK建议的替代方法,您可以使用reg.exe工具从远程注册表读取包含所需路径的键。 –

回答

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个注册表值ProfilesDirectoryAllUsersProfile的组合,而在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 
+0

你好,谢谢你的帮助Ansgar。 – user2934713

+0

我正在查看你的代码,并意识到我已经使用了%ALLUSERSPROFILES%,这是不需要的。我想弄清楚如何将你的代码合并到我必须使它们一起工作的东西中。 – user2934713

+0

这是Windows 7的环境 – user2934713

相关问题