2009-06-30 5 views

Répondre

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

Pourquoi ne pas simplement recycler (@ARGV)? –

+0

Bon point. J'ai édité la réponse. – FMc

+1

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

3

écrire un script VBS (Original Link) puis appelez avec 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

cela fonctionne, il suffit de passer votre chemin à l'aide antislashs ... – rogerdpack

+0

je reçois un message d'erreur sur Windows 7 lorsque i exécutez ce fichier vbs. Le message est "Ligne: 2, Char: 1, Erreur: caractère non valide, Code: 800A0408, Source: erreur de compilation Microsoft VBScript". J'ai essayé la suggestion ici, mais cela n'aide pas http://stackoverflow.com/a/9217824/781695 – Medorator

1

Vous pouvez utiliser l'utilitaire "recyclage", qui fait partie de CmdUtils de MaDdoG Software. De la liste des pages -

  • Recyclez, un remplacement sûr de la commande DEL, qui envoie les fichiers à la corbeille au lieu de les supprimer. Le recyclage est également plus flexible que DEL; vous pouvez spécifier plusieurs fichiers à la fois (ou utiliser des caractères génériques), et vous pouvez recycler des répertoires entiers à la fois (attention!)

Je vous suggère d'essayer ses différents commutateurs avant de l'intégrer dans votre script - il y a pas mal d'écart par rapport au comportement par défaut de la commande "del".

3

Le module Win32::FileOp a une fonction Recycle. A partir de la documentation:

Recycle @filenames

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

+0

Ah! Je n'avais pas réalisé que quelqu'un l'avait déjà implémenté. –

1

MISE À JOUR: Contrairement à ma demande initiale que le code suivant ne fonctionne pas, il semble en effet fonctionner. J'ai juste oublié que le fichier que je voulais supprimer n'était pas en $ENV{TEMP} mais un sous-répertoire de $ENV{TEMP}. Le problème est, le fichier ne va pas à la corbeille.

La bonne solution est d'utiliser Win32::FileOp mais je vais laisser ce script ici comme un exemple de la façon d'utiliser Win32::API et Win32::API::Struct. J'apprécierais que quelqu'un puisse signaler ce que je fais de mal. À titre de référence:

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__ 
Questions connexes