Как я могу переместить файлы в корзину в пакетном скрипте Windows или Perl? - PullRequest
6 голосов
/ 30 июня 2009

У меня есть пакетный скрипт Windows XP, который очищает некоторые каталоги, но я хотел бы переместить удаленные файлы в корзину вместо использования обычного del. Как это сделать?

Похоже, что единственные языки, которые я могу использовать для этого, это обычный пакет или Perl.

Ответы [ 5 ]

7 голосов
/ 30 июня 2009
use Win32::FileOp qw(Recycle);
Recycle(@ARGV);
3 голосов
/ 30 июня 2009

Модуль Win32 :: FileOp имеет функцию Recycle. Из документов:

Recycle @ filenames

Отправьте файлы в корзину. Вы не получите никаких диалогов подтверждения. Возвращает true в случае успеха.

3 голосов
/ 30 июня 2009

Написать сценарий VBS ( Исходная ссылка ), затем вызвать его с помощью 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");
}
1 голос
/ 30 июня 2009

ОБНОВЛЕНИЕ: Вопреки моему первоначальному утверждению, что следующий код не работает, он действительно работает. Я просто забыл, что файл, который я хотел удалить, был не в $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__
1 голос
/ 30 июня 2009

Вы можете использовать утилиту «recycle», которая является частью CmdUtils из MaDdoG Software . Со страницы листинга -

  • Recycle, безопасная замена для команды DEL, которая отправляет файлы в корзину вместо их удаления. Recycle также более гибок, чем DEL; Вы можете указать несколько файлов одновременно (или использовать подстановочные знаки), и вы можете перерабатывать целые каталоги одновременно (будьте осторожны!)

Я бы посоветовал вам опробовать различные его переключатели, прежде чем включать его в свой сценарий - здесь есть небольшое отклонение от поведения по умолчанию команды "del".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...