2009-06-30 16 views

risposta

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

Perché non solo ricicla (@ARGV)? –

+0

Buon punto. Ho modificato la risposta. – FMc

+1

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

3

scrivere uno script VBS (Original Link) quindi chiamare 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

questo funziona, basta assicurarsi di passare il vostro percorso utilizzando i backslash ... – rogerdpack

+0

ricevo un messaggio di errore in Windows 7 quando ho esegui questo file vbs. Il messaggio è "Linea: 2, Char: 1, Errore: Carattere non valido, Codice: 800A0408, Origine: errore di compilazione di Microsoft VBScript". Ho provato il suggerimento qui ma non aiuta http://stackoverflow.com/a/9217824/781695 – Medorator

1

È possibile utilizzare il programma di utilità "riciclo", che fa parte del CmdUtils da MaDdoG Software. Dalla pagina -

  • Ricicla, una sostituzione sicura per il comando DEL, che invia i file al cestino invece di eliminarli. Riciclare è anche più flessibile di DEL; puoi specificare più file contemporaneamente (o usare i caratteri jolly) e puoi riciclare intere directory contemporaneamente (fai attenzione!)

Ti suggerisco di provare i suoi vari interruttori prima di incorporarlo nel tuo script - c'è un bel po 'di deviazione dal comportamento predefinito del comando "del".

3

Il modulo Win32::FileOp ha una funzione Recycle. Dalla documentazione:

Recycle @filenames

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

+0

Ah! Non avevo realizzato che qualcuno lo avesse già implementato. –

1

UPDATE: Contrariamente alla mia affermazione iniziale che il seguente codice non funziona, sembra davvero funzionare. Ho appena dimenticato che il file che volevo eliminare non era in $ENV{TEMP} ma una sottodirectory di $ENV{TEMP}. Il problema è che il file non va nel Cestino.

La soluzione corretta è utilizzare Win32::FileOp ma ho intenzione di lasciare questo script qui come esempio di come utilizzare Win32::API e Win32::API::Struct. Lo apprezzerei se qualcuno potesse indicare cosa sto facendo male. Per il vostro riferimento:

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__ 
Problemi correlati