2009-06-30 38 views

Respuesta

7
use Win32::FileOp qw(Recycle); 
Recycle(@ARGV); 
+1

¿Por qué no acaba de reciclar (@ARGV)? –

+0

Buen punto. Edité la respuesta. – FMc

+1

perl -MWin32 :: FileOp = Reciclar -eRecycle (@ARGV) ... –

3

escribir un script VBS (Original Link) a continuación, llamar con 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"); 
} 
+0

esto funciona, sólo asegúrese de pasar su ruta con barras invertidas ... – rogerdpack

+0

me sale un mensaje de error en Windows 7 cuando ejecuta este archivo vbs. El mensaje es "Línea: 2, Char: 1, error: carácter no válido, código: 800A0408, origen: error de compilación de Microsoft VBScript". He intentado con la sugerencia aquí, pero no ayuda http://stackoverflow.com/a/9217824/781695 – Medorator

1

Se puede utilizar la utilidad de "reciclar", que es parte de CmdUtils de MaDdoG Software. De la lista de la página -

  • Reciclar, un reemplazo seguro para el comando DEL, que envía los archivos a la papelera de reciclaje en lugar de eliminarlos. Reciclar también es más flexible que DEL; puede especificar varios archivos a la vez (o usar comodines), y puede reciclar directorios completos a la vez (¡tenga cuidado!)

Le sugiero que pruebe varios de sus modificadores antes de incorporarlos a su script - hay bastante desviación del comportamiento predeterminado del comando "del".

3

Win32::FileOp El módulo tiene una función Recycle. A partir de los documentos:

Recycle @filenames

Send the files into the recycle bin. You will not get any confirmation dialogs. Returns true if successful.

+0

¡Ah! No me di cuenta de que alguien ya había implementado eso. –

1

ACTUALIZACIÓN: Contrariamente a mi reclamo original que el código siguiente no funciona, que de hecho parece que funciona. Me olvidé de que el archivo que quería eliminar no estaba en $ENV{TEMP} sino en un subdirectorio de $ENV{TEMP}. El problema es que el archivo no va a la Papelera de reciclaje.

La solución correcta es usar Win32::FileOp pero voy a dejar este script aquí como un ejemplo de cómo usar Win32::API y Win32::API::Struct. Apreciaría si alguien puede señalar lo que estoy haciendo mal. Para su referencia:

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__ 
Cuestiones relacionadas