我有一个Windows XP批处理脚本清理某些目录,但我想将删除的文件移到垃圾桶而不是使用普通del
。这是怎么做到的?
看起来我可以使用的唯一语言是普通批处理或Perl。
答案 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)
您可以使用“回收”实用程序,它是CmdUtils中MaDdoG Software的一部分。从页面列表 -
我建议您在将其合并到脚本之前尝试各种开关 - 这与“del”命令的默认行为有很大的偏差。
答案 4 :(得分:1)
更新:与我原来的声明相反,以下代码不起作用,它确实似乎有效。我忘了我要删除的文件不在$ENV{TEMP}
,而在$ENV{TEMP}
的子目录。问题是,文件没有进入回收站。
正确的解决方案是使用Win32::FileOp,但我将在此处留下此脚本作为如何使用Win32::API和Win32::API::Struct的示例。如果有人能指出我做错了什么,我将不胜感激。供您参考:
SHFileOperation
:http://msdn.microsoft.com/en-us/library/bb762164(VS.85).aspx
LPSHFILEOPSTRUCT
:http://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)。