如何在Windows批处理脚本或Perl中将文件移动到回收站?

时间:2009-06-30 09:58:20

标签: windows perl batch-file

我有一个Windows XP批处理脚本清理某些目录,但我想将删除的文件移到垃圾桶而不是使用普通del。这是怎么做到的?

看起来我可以使用的唯一语言是普通批处理或Perl。

6 个答案:

答案 0 :(得分:7)

use Win32::FileOp qw(Recycle);
Recycle(@ARGV);

答案 1 :(得分:3)

编写VBS脚本(Original Link),然后使用MyDelScript.vbs调用它

function main()
{
  if (WScript.Arguments.length != 1)
  {
    WScript.Echo("<Insert informative error message here>");
    return;
  }

  var Path = WScript.Arguments(0);
  var Shell = WScript.CreateObject("Shell.Application");
  var Item = Shell.Namespace(0).ParseName(Path);
  Item.InvokeVerb("delete");
}

答案 2 :(得分:3)

Win32::FileOp模块具有Recycle功能。来自文档:

  

回收@filenames

     

将文件发送到回收站。您将不会收到任何确认对话框。      如果成功则返回true。

答案 3 :(得分:1)

您可以使用“回收”实用程序,它是CmdUtilsMaDdoG Software的一部分。从页面列表 -

  • Recycle,DEL命令的安全替代品,用于将文件发送到回收站而不是删除它们。回收也比DEL更灵活;你可以一次指定多个文件(或使用通配符),你可以一次回收整个目录(小心!)

我建议您在将其合并到脚本之前尝试各种开关 - 这与“del”命令的默认行为有很大的偏差。

答案 4 :(得分:1)

更新:与我原来的声明相反,以下代码不起作用,它确实似乎有效。我忘了我要删除的文件不在$ENV{TEMP},而在$ENV{TEMP}子目录。问题是,文件没有进入回收站。

正确的解决方案是使用Win32::FileOp,但我将在此处留下此脚本作为如何使用Win32::APIWin32::API::Struct的示例。如果有人能指出我做错了什么,我将不胜感激。供您参考:

SHFileOperationhttp://msdn.microsoft.com/en-us/library/bb762164(VS.85).aspx

LPSHFILEOPSTRUCThttp://msdn.microsoft.com/en-us/library/bb759795(VS.85).aspx

#!/usr/bin/perl

use strict;
use warnings;

use File::Spec::Functions qw( catfile );
use Win32::API;

Win32::API::Struct->typedef(
    SHFILEOPSTRUCT => qw(
        HWND hwnd;
        UINT wFunc;
        LPCTSTR pFrom;
        LPCTSTR pTo;
        FILEOP_FLAGS fFlags;
        BOOL fAnyOperationsAborted;
        LPVOID hNameMappings;
        LPCTSTR lpszProgressTitle;
    )
);

Win32::API->Import(
    shell32 => q{ int SHFileOperation( LPSHFILEOPSTRUCT lpFileOp ) }
);

my $op = Win32::API::Struct->new( 'SHFILEOPSTRUCT' );
$op->{wFunc}  = 0x0003; # FO_DELETE from ShellAPI.h
$op->{fFlags} = 0x0040; # FOF_ALLOWUNDO from ShellAPI.h

my $to_delete = catfile( $ENV{TEMP}, "test.file" );
$op->{pFrom}  = $to_delete . "\0\0";

my $result = SHFileOperation( $op );

if ( $result ) {
    warn sprintf "The operation failed: %4.4X\n", $result;
}
else {
    if ( $op->{fAnyOperationsAborted} ) {
        warn "Operation was aborted\n";
    }
    else {
        warn "The operation succeeded\n";
    }
}
__END__

答案 5 :(得分:1)

可以使用普通批处理和嵌入式VBScript来完成此操作。将以下代码放入名为recycle.cmd的文件中:

<!-- : Begin batch script
@echo off

if "%1"=="" (
  echo Usage: %~nx0 FILE_TO_RECYCLE[...]
  echo This script puts files into the recycle bin
  exit /b 1
)

cscript //nologo "%~f0?.wsf" %*
exit /b %errorlevel%

----- Begin embedded wsf script --->
<job><script language="VBScript">
Set app = WScript.CreateObject("Shell.Application")
Set fso = CreateObject("Scripting.FileSystemObject")
For Each arg In WScript.Arguments
  If fso.FileExists(arg) Then
    Set file = fso.GetFile(arg)
    Set folderItem = app.Namespace(0).ParseName(file.Path)
    folderItem.InvokeVerb("delete")
  Else
    WScript.Echo "File not found: " & arg
  End If
Next
</script></job>

示例:

echo This file is dirt.> dirt.txt
echo This file is trash.> trash.txt
recycle dirt.txt trash.txt

如您所见,脚本允许使用一个命令来回收多个文件。 它不支持通配符*和?但是。

将vBScript嵌入批处理文件的想法来自dbenham对Is it possible to embed and execute VBScript within a batch file without using a temporary file?的回答(向下滚动至UPDATE 2014-04-27)。