PDA

View Full Version : Azione automatica


Cetto La Qualunque
07-09-2014, 17:35
Ho da fare un lungo e ripetitivo lavoro...inserire molti cd e copiare tutti i file sul cd in una cartella su hd.
Come posso fare in automatico solo cambiando il cd?
Ho scoperto la funzione Utilità di Pianificazione ma mi sa che non c'è questa operazione.
Al momento l'unica azione automatica che ho ottenuto è quella di aprire i cd per vederne il contenuto. Poi devo selezionare i file e trascinarli nella solita cartella.

Sapete se c'è un programma o un'azione automatica per fare questo?

x_Master_x
07-09-2014, 19:34
Ti farò una sola parte del VBS, la seconda ( cioè quella relativa alla copia dal DVD alla cartella ) la lascio a te, con un minimo di impegno ci riuscirai da solo

' x_Master_x
Dim sDrive
sDrive="E:" ' Cambia con la lettera del tuo lettore DVD

Set fso=WScript.CreateObject("Scripting.FileSystemObject")
If Not fso.DriveExists(sDrive) Then
WScript.echo "Il drive " & sDrive & " non è stato trovato"
WScript.Quit
End If

Do While fso.GetDrive(sDrive).IsReady=0
WScript.Sleep 1000
Loop
WScript.Echo "Il drive " & sDrive & " è pronto per l'uso"


Una volta eseguito lo script con il doppio click, lo stesso controlla automaticamente la lettera E: ed aspetta che inserisci un DVD. Una volta che trova un DVD, ti apparirà il messaggio "Il drive E: è pronto per l'uso" che sostituirai con la copia della cartella che lascio a te.
Una volta effettuata la copia, non ti resta altro che espellere il DVD, avviare nuovamente il VBS, inserire il DVD ed aspettare che finisca la copia...così via.

Cetto La Qualunque
07-09-2014, 21:44
Non so bene di cosa parli ma ci ho provato cercando su Google.
Può essere corretto così? :help:

Dim sDrive
sDrive="F:"

Set fso=WScript.CreateObject("Scripting.FileSystemObject")
If Not fso.DriveExists(sDrive) Then
WScript.echo "Il drive " & sDrive & " non è stato trovato"
WScript.Quit
End If

Do While fso.GetDrive(sDrive).IsReady=0
WScript.Sleep 1000
Loop
Const OverwriteExisting = True
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile "F:\*.xls" , "E:\archivio\" , OverwriteExisting
WScript.echo "copia F finita"

Partendo invece dalle basi...
- devo creare un file di testo con il blocco note e rinominarlo in script.vbs?
- inserisco il cd, faccio doppio click sul file script.vbs e parte la copia dopodiché cambio cd e riclicco due volte sul file script.vbs, esatto?
- per velocizzare ho recuperato un altro lettore cd/dvd...posso creare un secondo script2.vbs (ovviamente cambiando lettera del lettore) ed eseguirlo in contemporanea?

Comunque grazie per la dritta! :D

EDIT:
Mi rispondo per alcune domande:
- sì funziona
- a me funziona così
- anche il secondo script funziona in contemporanea

Grazie per la lezione!

x_Master_x
08-09-2014, 11:08
Ben fatto, io la copia l'avrei fatta con una barra di progresso:

' x_Master_x
sTarget = "C:\Destination"
sOrigin = "C:\Origin"

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(sTarget)

objFolder.CopyHere sOrigin & "\*.*"
WScript.Echo "Copia finita"


Folder.CopyHere method (http://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85).aspx)

A quel punto probabilmente avrei aggiuto una subroutine per evitare di aprire-chiudere il VBS ma questa è un'altra lezione :asd:

Cetto La Qualunque
08-09-2014, 14:03
Quindi sostituire le mie ultime 4 righe con quello che hai fatto tu?

Dim sDrive
sDrive="F:"

Set fso=WScript.CreateObject("Scripting.FileSystemObject")
If Not fso.DriveExists(sDrive) Then
WScript.echo "Il drive " & sDrive & " non è stato trovato"
WScript.Quit
End If

Do While fso.GetDrive(sDrive).IsReady=0
WScript.Sleep 1000
Loop
sTarget = "E:\archivio"
sOrigin = "F:"

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(sTarget)

objFolder.CopyHere sOrigin & "\*.xls"
WScript.Echo "Copia finita"

Mentre la subroutine invece a cosa servirebbe? Ad evitare il doppio click sul file script.vbs ogni volta che ho cambiato il cd?
Accetto volentieri suggerimenti pur di semplificare ulteriormente la luuuuuunga operazione. :D

EDIT:
Ho trovato questo per aprire il lettore cd:
CreateObject(“WMPlayer.OCX.7″).cdromCollection.Item(0).eject
Può andare bene al posto di WScript.Echo "Copia finita" ?

EDIT2:
No, non va, mi sa che è un po' più complicato...ho trovato questo ma va a cercare tutti i drive:
Set oWMP = CreateObject("WMPlayer.OCX.7")

Set colCDROMs = oWMP.cdromCollection

if colCDROMs.Count > 0 then
for i=0 to colCDROMs.Count - 1
strDrive= oWMP.cdromCollection.item(i).driveSpecifier
strQuestion = "Espellere drive " & strDrive & "?"
answer= msgbox (strQuestion, vbOKCancel)
if answer= vbOK then
colCDROMs.Item(i).Eject
strQuestion = "Chiudere drive " & strDrive & "?"
answer= msgbox (strQuestion, vbOKCancel)
if answer= vbOK then colCDROMs.Item(i).Eject
end if
next
end if
wscript.quit

Io vorrei far espellere il cd alla fine della copia e far ripartire la copia quando chiudo il lettore con un nuovo cd.

x_Master_x
08-09-2014, 20:31
Esempio di subroutine:

' x_Master_x
Call MySub_1

Sub MySub_1()
WScript.Echo "Passaggio 1"
Call MySub_2
End Sub

Sub MySub_2()
WScript.Echo "Passaggio 2"
Call MySub_3
End Sub

Sub MySub_3()
WScript.Echo "Passaggio 3"
Call TheEnd
End Sub

Sub TheEnd()
result = MsgBox ("Operazioni concluse. Ripetere da zero?", vbYesNo, "Attenzione")
Select Case result
Case vbYes
Call MySub_1
Case vbNo
WScript.Quit
End Select
End Sub


Questo serve per espellere un DVD da una specifica lettera:

' x_Master_x
sLetter = "D:" ' Da cambiare con la lettera del lettore

Set oWMP = CreateObject("WMPlayer.OCX.7")
Set colCDROMs = oWMP.cdromCollection

If colCDROMs.Count > 0 then
For i=0 to colCDROMs.Count - 1
sDrive = oWMP.cdromCollection.item(i).driveSpecifier
If sDrive = sLetter Then
colCDROMs.Item(i).Eject
End If
Next
End If


Questa è la versione "corta"

' x_Master_x
sLetter = "D:" ' Da cambiare con la lettera del lettore

Set oWMP = CreateObject("WMPlayer.OCX.7")
Set colCDROMs = oWMP.cdromCollection
Set oCD = oWMP.cdromCollection.getByDriveSpecifier(sLetter)
oCD.Eject


Le ultime due, entrambe, funzionano correttamente. Credo che come "lezioni" siamo apposto, ora tocca a te ;)

Cetto La Qualunque
08-09-2014, 20:53
Sì le ultime 2 funzionano correttamente.
Ora devo provare a comporre i vari passaggi, ossia:
1- copia da F: a E:
2- espelli carrello
3- quando il carrello rientra riparti dal passaggio 1

Cetto La Qualunque
08-09-2014, 21:05
' x_Master_x
Call MySub_1

Sub MySub_1()
sDrive="F:"

Set fso=WScript.CreateObject("Scripting.FileSystemObject")
If Not fso.DriveExists(sDrive) Then
Call TheEnd
End If

Do While fso.GetDrive(sDrive).IsReady=0
WScript.Sleep 1000
Loop
Const OverwriteExisting = True
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile "F:\*.xls" , "E:\archivio\" , OverwriteExisting

Call MySub_2
End Sub

Sub MySub_2()
Set oWMP = CreateObject("WMPlayer.OCX.7")

sLetter = "F:"

Set colCDROMs = oWMP.cdromCollection
Set oCD = oWMP.cdromCollection.getByDriveSpecifier(sLetter)
oCD.Eject
Call MySub_3
End Sub

Sub MySub_3()
Call TheEnd
End Sub

Sub TheEnd()
result = MsgBox ("Copia F finita. Ripetere da zero?", vbYesNo, "Attenzione")
Select Case result
Case vbYes
Call MySub_1
Case vbNo
WScript.Quit
End Select
End Sub

Passaggio 1 ,2 e 3 funzionano correttamente...copia,apre il carrello e mi chiede se voglio ripartire. Io inserisco e dico di sì e riparte la copia.
Ora devo vedere come sostituire il terzo passaggio...come posso fare per fargli capire di ripartire dal passaggio 1 quando il carrello è rientrato?

x_Master_x
09-09-2014, 09:36
?


Sub TheEnd()
Call MySub_1
End Sub


Però in questo modo non puoi uscire dallo script senza terminarlo dal Task Manager. Ti consiglio di separare meglio le subroutine ( una per controllare che la lettera esista aka fso.DriveExists, una il Do...Loop che aspetta che il lettore abbia un DVD inserito, una per la copia, una per espellere il DVD e l'ultima per ripetere la prima operazione ) e infine di dargli un nome comprensibile, Verifica() Copia() etc.

Cetto La Qualunque
09-09-2014, 11:07
Penso di aver riordinato meglio. Non ho capito bene però la chiusura che mi hai indicato...in teoria non riparte se dico sì e si interrompe tutto se dico no?

' x_Master_x
Call 1_Verifica

Sub 1_Verifica()
sDrive="F:"
Set fso=WScript.CreateObject("Scripting.FileSystemObject")
If Not fso.DriveExists(sDrive) Then
Call TheEnd
End If
Call 2_Lettore
End Sub

Sub 2_Lettore()
Do While fso.GetDrive(sDrive).IsReady=0
WScript.Sleep 1000
Loop
Call 3_Copia
End Sub

Sub 3_Copia()
Const OverwriteExisting = True
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile "F:\*.xls" , "E:\archivio\" , OverwriteExisting
Call 4_Espelli
End Sub

Sub 4_Espelli()
Set oWMP = CreateObject("WMPlayer.OCX.7")
sLetter = "F:"
Set colCDROMs = oWMP.cdromCollection
Set oCD = oWMP.cdromCollection.getByDriveSpecifier(sLetter)
oCD.Eject
Call 5_Finale
End Sub

Sub 5_Finale()
result = MsgBox ("Copia F finita. Ripetere da zero?", vbYesNo, "Attenzione")
Select Case result
Case vbYes
Call 1_Verifica
Case vbNo
WScript.Quit
End Select
End Sub


Per la barra di progresso della copia è un casino? Ho provato a cercare ma non ho trovato nulla di chiaro (soprattutto al mio livello :D ). Pensavo di far comparire la solita finestra di avanzamento quando si copiano i file solitamente.

x_Master_x
09-09-2014, 13:09
Penso di aver riordinato meglio. Non ho capito bene però la chiusura che mi hai indicato...in teoria non riparte se dico sì e si interrompe tutto se dico no?


Esatto, era riferito alla domanda "come posso fare per fargli capire di ripartire dal passaggio 1 quando il carrello è rientrato" cioè richiamare Sub 1_Verifica() direttamente quando aveva finito la copia, il carrello che sia fuori o dentro non importa tanto ricerca sempre se è presente un DVD nel lettore.
Lascia come l'ho scritto in precedenza comunque, era solo un esempio.

Per la barra di progresso della copia è un casino?

Te l'ho già scritta, post #4
La copi-incolli nella Sub 3_Copia() cambiando i percorsi con i tuoi, è la stessa barra di progresso che usa Windows

P.S. C'è un errore:

If Not fso.DriveExists(sDrive) Then
Call TheEnd
End If

Dovrebbe essere:

If Not fso.DriveExists(sDrive) Then
WScript.Echo "Il drive " & sDrive & " non è stato trovato"
WScript.Quit
End If


Se non trova il lettore è inutile continuare, deve uscire.

Cetto La Qualunque
09-09-2014, 13:24
Ok, spero di aver capito le correzioni. Grazie ancora per la disponibilità!
Già sto velocizzando di molto il lavoro grazie al tuo aiuto! :ave:

' x_Master_x
Call 1_Verifica


Sub 1_Verifica()
sDrive="F:"
Set fso=WScript.CreateObject("Scripting.FileSystemObject")
If Not fso.DriveExists(sDrive) Then
WScript.Echo "Il drive " & sDrive & " non è stato trovato"
WScript.Quit
End If
Call 2_Lettore
End Sub


Sub 2_Lettore()
Do While fso.GetDrive(sDrive).IsReady=0
WScript.Sleep 1000
Loop
Call 3_Copia
End Sub


Sub 3_Copia()
Const OverwriteExisting = True
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile "F:\*.xls" , "E:\archivio\" , OverwriteExisting

sTarget = "E:\archivio\"
sOrigin = "F:"

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(sTarget)

objFolder.CopyHere sOrigin & "\*.xls"
Call 4_Espelli
End Sub


Sub 4_Espelli()
Set oWMP = CreateObject("WMPlayer.OCX.7")
sLetter = "F:"
Set colCDROMs = oWMP.cdromCollection
Set oCD = oWMP.cdromCollection.getByDriveSpecifier(sLetter)
oCD.Eject
Sub 1_Verifica
End Sub

x_Master_x
09-09-2014, 14:10
Sub 3_Copia()
sTarget = "E:\archivio"
sOrigin = "F:"

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(sTarget)

objFolder.CopyHere sOrigin & "\*.xls"
Call 4_Espelli
End Sub


Nella tua versione hai messo 2 volte la copia, per il resto sei apposto così.

P.S. Ricordati che per come è strutturato 4_Espelli() puoi solo terminarlo dal Task Manager per uscire, altrimenti usa la versione con il MsgBox