0

txt ファイルから読み取られる複数のフォルダーを削除しようとしています。現在ログオンしているユーザーを取得しているときに、テキスト ファイル内のコンピューターをループする方法がわかりません。私はいくつかのコードを試しましたが、現在持っているものとマージするのに十分な経験がありません.

%APPDATA%などを含むフォルダーを除いて、txtファイル内のコンピューターのリストからフォルダーを削除する作業スクリプトがあります...これが、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 つのレジストリ値の組み合わせですが、Windows 7 ではレジストリ値ProfilesDirectoryからAllUsersProfile派生します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 に答える