Esegui un'attività su un evento specifico, ma solo una volta al mese


1

C'è qualche opzione per eseguire un'attività quando si verifica un evento specifico (ad esempio, Flash Drive inserita), ma per farlo solo una volta al mese?

Sto provando ad agganciare il mio script di backup su qualche evento automatico ..

Sistema operativo: Windows 7 x64 Professional

Risposte:


2

Hai esperienza con WMI ( Strumentazione gestione Windows )? È perfetto per questo tipo di compiti. Inoltre, è una parte di Windows, quindi dovrebbe causare un sovraccarico minimo.

Di seguito è riportato un esempio di script Perl che esegue alcune semplici azioni quando viene collegata un'unità USB. Lo script non deve essere in Perl, WMI supporta un'intera gamma di linguaggi di scripting e di programmazione.

Alcune variabili

use Win32::OLE::Const 'Microsoft WMI Scripting';

my $ComputerName = "localhost";
my $NameSpace = "root/cimv2";
my $WbemServices = Win32::OLE->GetObject("winmgmts://$ComputerName/$NameSpace");

Registrati evento (usb collegato)

my $Instance = $WbemServices->Get(__EventFilter)->SpawnInstance_();
$Instance->{Name}          = "myfilter";
$Instance->{QueryLanguage} = "WQL";
$Instance->{Query} = qq[SELECT * FROM __InstanceCreationEvent WITHIN 1
                           WHERE TargetInstance ISA 'Win32_LogicalDisk' 
                           and TargetInstance.Name<>'B:' 
                           and TargetInstance.Name<>'A:'];
    # there are other queries possible

my $Filter = $Instance->Put_(wbemFlagUseAmendedQualifiers);
my $Filterpath = $Filter->{path};

Definisci azione

# example 1 : execute script
my $Instance = $WbemServices->Get(ActiveScriptEventConsumer)->SpawnInstance_();
$Instance->{Name}            = "myscript";
$Instance->{ScriptingEngine} = "PerlScript";
$Instance->{ScriptText}      = q[open FILE, ">>C:\\\\usb.txt";print FILE "USB plugged in\n";];
    # you could call your backup script / check for dates / etc.

# example 2 : execute command
my $Instance = $WbemServices->Get(CommandLineEventConsumer)->SpawnInstance_();
$Instance->{Name}                = "mycommand";
$Instance->{CommandLineTemplate} = "echo Hello world!";
    # you could call your backup script / check for dates / etc.

my $Consumer = $Instance->Put_(wbemFlagUseAmendedQualifiers);
my $Consumerpath = $Consumer->{path};

Collega evento e azione

my $Instance = $WbemServices->Get(__FilterToConsumerBinding)->SpawnInstance_();
$Instance->{Filter}   = $Filterpath;
$Instance->{Consumer} = $Consumerpath;
my $Result = $Instance->Put_(wbemFlagUseAmendedQualifiers);

Questa è una forma di registrazione permanente degli eventi. Per disabilitare e pulire l'intero processo, rimuovi gli oggetti creati:

  • l'istanza __EventFilter "myfilter"
  • l'istanza __EventConsumer "myscript" o "mycommand"
  • l'istanza __EventToConsumerBinding

Puoi cercare gli oggetti usando WMI CIM Studio. Scaricabile da Microsoft gratuitamente, Qui .


È inoltre possibile utilizzare WMI CIM Studio per creare gli oggetti richiesti ed evitare di crearli con uno script ... Ad esempio: cercare "__EventFilter", individuare il pulsante "crea istanza", compilare gli attributi obbligatori minimi (vedere script) e terminare premendo il pulsante 'Salva'.
Sander

0

Avere la sceneggiatura:

  • controlla se esiste un file (/ etc / last_backup) AND ha meno di X giorni. Non esegue il backup in altro modo (poiché non ne vale la pena: un altro backup è avvenuto meno di 30 giorni fa)

  • se non esiste, o è più vecchio di X dayx, esegue il backup. E tocca quel file (tocca / etc / last_backup) una volta che il backup è completo al 100%.

In questo modo puoi anche sapere quando è avvenuto l'ultimo backup completo (guarda / etc / last_backup)

Un modo per sapere se il file esiste ed è MENO di 30 giorni:

find /etc -mtime -30 | grep /etc/last_backup >/dev/null 2>/dev/null

e subito dopo, $? sarà "0" se grep potrebbe trovarlo

In questo modo, per forzare il backup, basta rimuovere il file / etc / last_backup e la volta successiva che lo script avvierà il backup.


oh mio ... windows. È possibile utilizzare il pacchetto GNU utils per windows (o cygwin) per lo script. E penso che si possa facilmente aggiungere questo al autorun.inf del disco stesso (google per "avviare lo script quando si collega l'unità USB di Windows 7") (se si autorizzano ancora i comandi autorun.inf, che non è veramente consigliato ...)
Olivier Dulac

0

Suggerisco Task Scheduler sarebbe un'idea più semplice. Tuttavia, il successo dipende dalla ricerca di un trigger per l'evento, e per quello vorrei guardare nei registri degli eventi.

Il mio pensiero è quello di padroneggiare il comando di backup, salvare in uno script, quindi utilizzare la potenza del servizio Utilità di pianificazione per gestire i tempi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.