Как я могу переместить файлы в Корзину в сценарии пакетной обработки Windows или Perl?

Программное обеспечение с открытым исходным кодом стоит дороже в долгосрочной перспективе

Для обычных компаний, занимающихся линейным бизнесом, Open Source выглядит бесплатно, но имеет скрытые затраты.

Если принять во внимание несоответствие качества, удобства использования и UI / UX, трудности взаимодействия и стандартов, расширенную конфигурацию, связанную с этим повышенную потребность в обучении и поддержке, общая стоимость владения открытым исходным кодом намного выше, чем в коммерческих предложениях. .

Технически подкованные программисты берут освобождение Open Source и работают с ним; они «получают» и могут принять его и настроить в соответствии со своими целями. С другой стороны, предприятия, которые в основном являются нетехническими, но нуждаются в программном обеспечении для управления своими офисами, сетями и веб-сайтами, подвергаются риску боли для себя и больших затрат с точки зрения потерянного времени, производительности и (в конечном итоге) поддержки сборы и / или стоимость отказа от эксперимента все вместе.

6
задан brian d foy 1 July 2009 в 08:04
поделиться

5 ответов

use Win32::FileOp qw(Recycle);
Recycle(@ARGV);
7
ответ дан 8 December 2019 в 16:09
поделиться

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

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

Recycle @filenames

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

3
ответ дан 8 December 2019 в 16:09
поделиться

Напишите сценарий 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");
}
3
ответ дан 8 December 2019 в 16:09
поделиться

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

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

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

1
ответ дан 8 December 2019 в 16:09
поделиться