在特定事件上运行任务,但每月仅运行一次

在特定事件上运行任务,但每月仅运行一次

是否有任何选项可以在发生特定事件(即插入闪存驱动器)时运行任务,但每月只执行一次?

我正在尝试将我的备份脚本挂在某些自动事件上。

操作系统: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

我认为任务计划程序是一个更简单的想法。但是,成功取决于找到事件的触发器,为此我会查看事件日志。

我的想法是掌握备份命令,保存在脚本中,然后使用任务计划程序服务的功能来处理计时。

相关内容