2013-10-30 33 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

相關問題