月に1回だけ、特定のイベントでタスクを実行する


1

特定のイベント(フラッシュドライブの挿入など)が発生したときにタスクを実行するオプションはありますが、月に一度だけ実行しますか?

自動イベントでバックアップスクリプトをフックしようとしています。

OS:Windows 7 x64 Professional

回答:


2

WMI(Windows Management Instrumentation)の経験はありますか?この種のタスクに最適です。また、Windowsの一部であるため、オーバーヘッドを最小限に抑える必要があります。

以下は、USBドライブが接続されたときにいくつかの簡単なアクションを実行するPerlスクリプトの例です。スクリプトはPerlである必要はなく、WMIはあらゆる種類のスクリプト言語とプログラミング言語をサポートしています。

いくつかの変数

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

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

イベントの登録(USBプラグイン)

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};

アクションを定義する

# 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};

イベントとアクションをリンクする

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

これは、恒久的なイベント登録の形式です。プロセス全体を無効にしてクリーンアップするには、作成したオブジェクトを削除します。

  • __EventFilterインスタンス「myfilter」
  • __EventConsumerインスタンス「myscript」または「mycommand」
  • __EventToConsumerBindingインスタンス

WMI CIM Studioを使用してオブジェクトを検索できます。こちらからMicrosoftから無料でダウンロードできます


WMI CIM Studioを使用して必要なオブジェクトを作成し、スクリプトで作成しないようにすることもできます。たとえば、「__ EventFilter」を検索し、「インスタンスを作成」ボタンを見つけ、最小限の必須属性を入力します(スクリプトを参照) 「保存」ボタンを押して終了します。
サンダー

0

スクリプトを持っている:

  • ファイル(/ etc / last_backup)が存在し、X日未満であるかどうかを確認します。それ以外の場合はバックアップしません(価値がないため、別のバックアップが30日以内に発生しました)

  • 存在しない場合、またはX dayxより古い場合、バックアップします。そして、バックアップが100%完了したら、そのファイルに触れます(/ etc / last_backupに触れます)。

そうすれば、最後の完全バックアップがいつ発生したかを知ることもできます(/ etc / last_backupを見てください)

ファイルが存在し、30日未満であるかどうかを確認する方法:

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

そしてその直後、$?grepが見つけた場合は「0」になります

そのようにして、バックアップを強制するには、/ etc / last_backupファイルを削除するだけで、次回スクリプトがバックアップを開始します。


ああ、私の窓。スクリプトには、Windows用のGNU utilsパッケージ(またはcygwin)を使用できます。そして、これをドライブ自体のautorun.infに簡単に追加できると思います(「USBドライブWindows 7を接続するときにスクリプトを開始する」のGoogle)(まだお勧めしませんautorun.infコマンドを許可している場合...)
オリビエデュラック

0

タスクスケジューラの方が簡単だと思います。ただし、成功はイベントのトリガーを見つけることにかかっているため、イベントログを確認します。

私の考えは、バックアップコマンドを習得し、スクリプトに保存し、タスクスケジューラサービスのパワーを使用してタイミングを処理することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.