PDA

View Full Version : [VBScript] Spostare un file nel cestino


Trial4life
17-02-2014, 10:34
Ciao a tutti,
sto cercando un modo per spostare un file nel cestino tramite VBScript. Con il metodo DeleteFile dell'oggetto FileSystemObject, il file specificato viene elminato definitivamente. Invece c'è un modo per spostarlo nel cestino? È complicato?

Daniels118
17-02-2014, 11:40
Potresti utilizzare questo tool: http://www.maddogsw.com/cmdutils/

Trial4life
17-02-2014, 12:01
Non c'è un'alternativa che non richieda programmi esterni?

x_Master_x
17-02-2014, 12:05
Send a File to the Recycle Bin (http://gallery.technet.microsoft.com/scriptcenter/191eb207-3a7e-4dbc-884d-5f4498440574)
FolderItem.InvokeVerb method (http://msdn.microsoft.com/en-us/library/windows/desktop/bb787816(v=vs.85).aspx)

Daniels118
17-02-2014, 12:18
Quello è il modo corretto, però ha un inconveniente: viene visualizzata la finestra per la conferma della cancellazione.
L'alternativa è di modificare delle chiavi di registro, ma al momento non ricordo quali.

Trial4life
17-02-2014, 13:16
Ho provato con lo script nel primo link, ma non funziona... non appare neanche la finestra di conferma della cancellazione. Com'è possibile?
(Non viene visualizzato nessun errore)

Daniels118
17-02-2014, 13:25
Ops, non mi ero accorto che fossero dei link...
sostituisci quest'istruzione
objFolderItem.InvokeVerb("&Delete")
con questa:
objFolderItem.InvokeVerb("delete")

Trial4life
17-02-2014, 14:39
Funziona! Grazie mille!

Trial4life
17-02-2014, 20:48
Mmh... c'è un altro piccolo problema.
Nello script che sto cercando di realizzare, ho bisogno di spostare nel cestino tanti file contemporaneamente. Per farlo, ho utilizzato il codice che ha linkato x_Master_x all'interno di una Sub, che ho poi richiamato in un ciclo For, in modo da spostare nel cestino ogni file presente nella cartella.
Il problema è che in questo modo i file vengono spostati nel cestino uno ad uno, mettendoci molti secondi per completare l'operazione quando i file sono varie centinaia. Invece, l'ideale sarebbe spostarli tutti contemporaneamente nel cestino...

Avete qualche idea?

Daniels118
18-02-2014, 08:22
Puoi iterare sulle istruzioni di cancellazione invece che sull'intero codice.

Se i file si trovano tutti nella stessa cartella basta inserire queste due istruzioni nel ciclo:
Set objFolderItem = objFolder.ParseName(strFileName(i))
objFolderItem.InvokeVerb("delete")
dove strFileName è un array che contiene i nomi dei file (non i percorsi assoluti) e i è la variabile indice del ciclo for.
Se hai i percorsi assoluti puoi ricavare i nomi dei file con questa istruzione:
strFileName = fso.GetFileName(pathAssoluto(i))
in questo caso strFileName è una stringa e pathAssoluto un array.

Se invece i file si trovano in cartelle diverse dovrai inserire queste istruzioni nel ciclo:
strFolderParent = fso.GetParentFolderName(pathAssoluto(i))
strFileName = fso.GetFileName(pathAssoluto(i))
Set objFolder = objShell.Namespace(strFolderParent)
Set objFolderItem = objFolder.ParseName(strFileName)
objFolderItem.InvokeVerb("delete")

Trial4life
18-02-2014, 13:36
Mmh... a grandi linee ho capito cosa intendi, ma non credo di aver capito bene come impostare il codice.

Allora innanzitutto i file sono tutti nella stessa cartella. Tuttavia, lo script serve a cancellare tutti i file di un solo tipo all'interno di una cartella, quindi non tutti i file contenuti in essa.

Per ora la parte di codice in questione è questa:
Set FolderRecycle = objFSO.GetFolder(FolderPath)
For Each File In FolderRecycle.Files
If Right(File.name,ExtLen) = Extension Then
Toss(FolderPath & "\" & File.name)
End If
Next

Dove:
- FolderPath è il percorso della cartella in cui ci sono i file
- Extension è l'estensione dei file da cancellare
- ExtLen è la lunghezza della stringa Extension
- Toss è la Sub con argomento "strFileToToss", contente il codice preso dal link di prima.

Quindi tu mi stai dicendo di togliere quel ciclo For Each, lasciando soltanto il ciclo l'istruzione If, e inserire un ciclo For..To all'interno della sub Toss? Ma lo devo mettere solo per la definizione di strFileName, o anche per lo spostamento nel cestino?

Daniels118
18-02-2014, 14:07
:what: Cosa? Il ciclo i... :ncomment:
Const HKEY_CURRENT_USER = &H80000001

Private Sub moveToRecycle(FolderPath, Extension)
strComputer = "."
Set fso = CreateObject("Scripting.FileSystemObject")
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "Software\Microsoft\Windows\CurrentVersion\Explorer"
strValueName = "ShellState"
Call oReg.GetBinaryValue(HKEY_CURRENT_USER,strKeyPath, strValueName,strValue)
strOrigBinSet = strValue(4)
strValue(4) = 39
errReturnA = oReg.SetBinaryValue(HKEY_CURRENT_USER, strKeyPath, strValueName, strValue)
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(FolderPath)
'
Set FolderRecycle = objFSO.GetFolder(FolderPath)
For Each File In FolderRecycle.Files
If Right(File.name, 4) = "." & Extension Then
Set objFolderItem = objFolder.ParseName(File.name)
objFolderItem.InvokeVerb("delete")
End If
Next
'
strValue(4) = strOrigBinSet
errReturnB = oReg.SetBinaryValue(HKEY_CURRENT_USER, strKeyPath, strValueName, strValue)
End Sub
Non testato.

Trial4life
18-02-2014, 14:08
Ops... ahahahah mi sono sbagliato :D

Trial4life
18-02-2014, 14:28
Non è cambiato molto... la velocità di spostamento nel cestino è sempre quella (per 300 files ci metterà all'incirca 20 secondi).

Lo script è in grado anche di rimuovere i file senza spostarli nel cestino. Per farlo, ho usato:
objFSO.DeleteFile(ELIMINA)
con ELIMINA = FolderPath & "\*." & Extension

In questo modo, con l'asterisco, tutti i file dell'estensione Extension vengono rimossi contemporaneamente (senza bisogno di nessun ciclo!), e ci mette davvero un attimo.

C'è un modo per usare l'asterisco anche nella Sub di prima?

Daniels118
18-02-2014, 15:45
Const HKEY_CURRENT_USER = &H80000001
Const SHCONTF_NONFOLDERS = 64

Private Sub moveToRecycle(FolderPath, Extension)
strComputer = "."
Set fso = CreateObject("Scripting.FileSystemObject")
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "Software\Microsoft\Windows\CurrentVersion\Explorer"
strValueName = "ShellState"
Call oReg.GetBinaryValue(HKEY_CURRENT_USER,strKeyPath, strValueName,strValue)
strOrigBinSet = strValue(4)
strValue(4) = 39
errReturnA = oReg.SetBinaryValue(HKEY_CURRENT_USER, strKeyPath, strValueName, strValue)
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(FolderPath)
'
Set objFolderItems = objFolder.Items()
Call objFolderItems.Filter(SHCONTF_NONFOLDERS, "*." & Extension)
Call objFolderItems.InvokeVerbEx("delete")
'
strValue(4) = strOrigBinSet
errReturnB = oReg.SetBinaryValue(HKEY_CURRENT_USER, strKeyPath, strValueName, strValue)
End Sub

Trial4life
18-02-2014, 20:50
Davvero geniale!
Non so come ringraziarti!!! Funziona tutto alla perfezione :)

mecrally
15-08-2018, 11:18
Ciao a tutti e buon Ferragosto! Mi chiedevo: esiste uno script che permette di spostare i files che voglio cancellare nel cestino del disco C anziché eliminarli definitivamente??? Sarebbe estremamente utile, dal post che leggo sembra che ci siamo quasi ma non capisco tutte quelle righe di codice dove/come le devo inserire...

Mursey
15-08-2018, 15:18
non capisco tutte quelle righe di codice dove/come le devo inserire...
Quattro anni fa qui si parlava di VBscript.

A te serve un file batch immagino... ?

Daniels118
15-08-2018, 15:57
07E soprattutto perché sottolinei il cestino del disco c? Stiamo per caso parlando di file su un disco esterno?
Edit: non avevo visto il titolo...
Quando mandi un file nel cestino in realtà il file resta dov'è, viene semplicemente nascosto, per questo puoi inviarvi file enormi senza alcuna attesa... Ovviamente ciò non è possibile se il file risiede su un disco esterno perché non c'è garanzia che questo sia ancora collegato qualora decidessi di ripristinare il file. In questo caso il sistema deve effettuare una copia del file da qualche parte, e per farlo occorre eseguire una configurazione sul cestino per il disco in oggetto.

Slater91
15-08-2018, 16:27
Ciao a tutti e buon Ferragosto! Mi chiedevo: esiste uno script che permette di spostare i files che voglio cancellare nel cestino del disco C anziché eliminarli definitivamente??? Sarebbe estremamente utile, dal post che leggo sembra che ci siamo quasi ma non capisco tutte quelle righe di codice dove/come le devo inserire...

Ripescare una discussione vecchia di quattro anni non è una buona idea. Meglio aprirne una nuova (magari nella sezione Windows)...