是否有任何选项可以在发生特定事件(即插入闪存驱动器)时运行任务,但每月只执行一次?
我正在尝试将我的备份脚本挂在某些自动事件上。
操作系统:Windows 7 x64 Professional
答案1
您有使用 WMI 的经验吗?Windows 管理规范)?它非常适合这类任务。此外,它是 Windows 的一部分,因此应该只产生最小的开销。
下面是一个 Perl 脚本的示例,它在插入 USB 驱动器时执行一些简单的操作。您的脚本不必使用 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 免费下载,这里。
答案2
有脚本:
检查文件 (/etc/last_backup) 是否存在且时间少于 X 天。否则不备份(因为不值得:另一次备份发生在不到 30 天前)
如果不存在,或者早于 X 天,则进行备份。并且,一旦备份 100% 完成,它就会触碰该文件 (touch /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 文件,下次脚本就会启动备份。
答案3
我认为任务计划程序是一个更简单的想法。但是,成功取决于找到事件的触发器,为此我会查看事件日志。
我的想法是掌握备份命令,保存在脚本中,然后使用任务计划程序服务的功能来处理计时。