在回收站中复制文件名

时间:2018-08-17 09:49:11

标签: windows cmd vbscript

我正在尝试在Windows 10的回收站中复制所有文件名列表。

我转到命令提示符:

C:\>cd C:/$Recycle.Bin
C:\$Recycle.Bin>dir S-1-5-21-2370250818-2711005194-4184312249-1165

$R8CQG1I.txt
$IURO2ZD.txt
$RV2TEJ7.txt

我有3个文件,我想复制真实文件名,而不是像这样的结果。

经过一番搜索,我找到了这个VBScript。我运行代码,然后收到此错误:

  

预计语句结束

Option Explicit

DIM g_objWshShell, g_objFSO, g_sLogFile, g_objWshNetwork, g_sScriptName, g_sComputerName, g_sUserName Dim g_sVer, g_objLogFile, g_sLogDir

'Setup main variables and objects Set g_objWshShell = WScript.CreateObject("WScript.Shell")  'Create a Shell Object Set g_objFSO = CreateObject("Scripting.FileSystemObject") 'create a File System Object Set g_objWshNetwork = WScript.CreateObject("WScript.Network") 'Create Network Object g_sComputerName
= g_objWshNetwork.Computername      'Gets machine Computer name g_sUserName = g_objWshNetwork.UserName              'Gets logged-on username g_sScriptName=UCase(WScript.ScriptName)    '
*** Name of the script

' *** START LogFile Information - use Delete or Append info below; don't use both *** Const FORREADING = 1, FORWRITING = 2, FORAPPENDING
= 8  'Setup constants for writing, appending, etc g_sLogDir = "C:\TEMP" If Not (g_objFSO.FolderExists(g_sLogDir)) Then  g_objFSO.CreateFolder(g_sLogDir) End If g_sLogFile = g_sLogDir & "\" & Left(g_sScriptName,len(g_sScriptName)
- 3) & "LOG" 'Makes log file the SCRIPTNAME.Log g_sVer = "1.0"

'To delete a logfile and create a new one each time script is ran If g_objFSO.FileExists(g_sLogFile) Then   g_objFSO.DeleteFile(g_sLogFile) 'Delete logfile if it exists. End If Set g_objLogFile = g_objFSO.CreateTextFile(g_sLogFile, FORWRITING) 'Setup the logfile for writing

Call Main() Call ExitScript()

'Start main script HERE *** Sub Main()  Dim objRecycleBin, objFolderItems, objItem, strSpecialFolderName    strSpecialFolderName = "Recycle Bin"        'Call WriteLine("Starting " &  g_sScriptName & " at " & Date & " " & Time, g_objLogFile)    Set objRecycleBin
= GetSpecialFolderObject(strSpecialFolderName)      'Get Special Folder based upon input name   Set objFolderItems = objRecycleBin.Items()                      'Get items within Recycle Bin   For Each objItem In objFolderItems                  'Delete all items within Special Folder         If (objItem.Type = "File Folder") Then          'Check for file type            g_objFSO.DeleteFolder(objItem.Path)         'Delete Folders         Else            g_objFSO.DeleteFile(objItem.Path)           'Delete Files       End If      WScript.Echo "Deleted " & objItem.Name  Next     End Sub

'*-*-*-*-*- Start Subroutines here
*-*-*-*-*- 'Returns SpecialFolder based upon name of folder Function GetSpecialFolderObject(NameOfFolder)   Dim objShellApp, i, objSpecialFolder    Set objShellApp = CreateObject("Shell.Application")     On Error Resume Next    For i=0 To 40   '40 is highest value for special folders        Set objSpecialFolder = objShellApp.NameSpace(i)         If (StrComp(objSpecialFolder.Title,NameOfFolder,vbTextCompare)=0) Then          Set GetSpecialFolderObject = objSpecialFolder           Exit For        End If  Next    Err.Clear End Function

'Closes logfile and exits script Sub ExitScript()   'Call WriteLine(Date & " " & Time & "; Completed " & g_sScriptName, g_objLogFile)   If IsObject(g_objLogFile) Then
        g_objLogFile.Close  End If  Wscript.Quit  End Sub

Sub EndOnError(sErrorString)    WScript.Echo sErrorString & vbcrlf & "Check " & chr(34) & g_sLogFile & Chr(34) & " for details"     Call WriteLine (sErrorString, g_objLogFile)     WScript.Quit() End Sub

'Shows usage if input is wrong sub ShowUsage()  WScript.Echo g_sScriptName & " v" & g_sVer & " Empties Recycle Bin for logged on user" & vbcrlf _   & vbcrlf & "USAGE: [CSCRIPT] " & g_sScriptName  WScript.Quit end sub

'Writes to log Sub WriteLine(ByVal strMessage, ByVal objFile)
    On Error Resume Next
    If IsObject(objFile) then        'objFile should be a file object
        objFile.WriteLine strMessage
    Else
        Call Wscript.Echo( strMessage )
    End If End Sub

2 个答案:

答案 0 :(得分:1)

在PowerShell中,您可以像这样列出回收站内容的当前路径和原始名称/位置:

$shell = New-Object -ComObject Shell.Application

$shell.NameSpace(0x0a).Items() |
    Select-Object @{Label="OriginalLocation";Expression={$_.ExtendedProperty("{9B174B33-40FF-11D2-A27E-00C04FC30871} 2")}},Name, Path

要复制项目,您可以执行以下操作:

$shell.NameSpace(0x0a).Items() |
    Copy-Item -Destination "C:\RecoveredFiles\$($_.Name)" -Recurse -Force

请注意,这没有考虑任何名称冲突-您需要对此进行测试并进行相应调整。

答案 1 :(得分:1)

@boxdog的VBScript版本答案:

Set objShellApp = CreateObject("Shell.Application")
Set objSpecialFolder = objShellApp.NameSpace(10) '10 = Recyle Bin
For Each objFolder In objSpecialFolder.Items
    WScript.Echo "FileName = " & objFolder.Name & vbTab & "Original Path = " & objFolder.ExtendedProperty("{9B174B33-40FF-11D2-A27E-00C04FC30871} 2")
Next

如果有人正在寻找仅VBS解决方案,请回答此问题。