如果双击但未在Windows计划任务中运行,则批处理文件正常运行

时间:2015-02-20 20:46:50

标签: batch-file vbscript scheduled-tasks

我的C:盘上有一个archive.pst文件,我在outlook中使用它来备份我的电子邮件。但我的C:每晚都没有备份。因此,我想将.pst文件复制到我的网络驱动器,以便始终备份。我不希望outlook出于各种原因直接从网络驱动器打开.pst文件。

因此,我正在尝试创建一个计划任务,每天将我的.pst文件复制到网络位置。如果双击,下面的批处理文件将完美运行。如果我尝试运行计划任务,则只创建日志文件。 Outlook不会关闭,并且不会复制.pst文件。我尝试过以最高权限运行,但这似乎没有帮助。任何想法都将不胜感激。

cscript.exe close_outlook.vbs
    ::This is my VBS Script
        ::Set Outlook = CreateObject("Outlook.Application")
        ::Outlook.Quit

ping localhost > nul

set idrive="\\myserver\drive\\Outlook Files\"
set current="C:\myfolder\myuser\Documents\Outlook Files"

echo Start Time of Copy: %time% >> %idrive%\Log.txt
copy %current%\archive.pst %idrive%\archive.pst /y
echo End Time of Copy: %time% >> %idrive%\Log.txt

move %idrive%\Log.txt %idrive%\BackupLogs\Log.txt
ren %idrive%\BackupLogs\Log.txt %date:~10,4%-%date:~4,2%-%date:~7,2%_log.txt

cscript.exe open_outlook.vbs
    ::This is my VBS Script
        ::set shell = createobject("wscript.shell") 
        ::shell.run "outlook.exe"
EXIT

2 个答案:

答案 0 :(得分:0)

1。指定批处理文件中的所有文件,作为具有完整路径的计划任务执行。

双击批处理文件通常会导致运行批处理文件,当前工作目录是批处理文件的目录。但是,当按批处理任务运行批处理文件时,Windows的system32目录是当前工作目录。

Windows的system32目录中是close_outlook.vbsopen_outlook.vbs吗?

我不这么认为。通过正确的路径将Path to\Script File下面的批次代码替换为两次。

2。将带空格的字符串值分配给环境变量。

variable=value是命令 set 的参数。与

set idrive="\\myserver\drive\\Outlook Files\"

您为变量 idrive分配了包含双引号的值"\\myserver\drive\\Outlook Files\"。这导致了

的扩展
echo End Time of Copy: %time% >> %idrive%\Log.txt

在命令行中

echo End Time of Copy: 19:21:53 >> 1>"\\myserver\drive\\Outlook Files\"\Log.txt

这是不对的,不是。

正确的是:

set "idrive=\\myserver\drive\Outlook Files"

我在drive之后删除了第二个反斜杠,并在文件夹路径末尾删除了反斜杠。

由于环境变量现在包含空格(不带双引号)的路径,因此必须添加双引号,其中环境变量的值与文件名串联使用,请参阅下面的批处理代码。

使用"variable=value"还有一个原因。如果未使用或使用错误的双引号,则在批处理文件中使用命令 set 的行末尾不可见的尾随空格也会附加到环境变量的值。有关将字符串值正确分配给环境变量的详细信息,请阅读this answer

3。使用命令ping更好地定义等待循环。

命令

ping localhost > nul

产生等待。但最好使用像

这样的东西
%SystemRoot%\System32\ping.exe -n 4 127.0.0.1>nul

现在等待时间恰好是3秒。

4。不要在重定向运算符左侧插入空格>或>>对于标准输出。

我为here详细解释了为什么不应该这样做。

5。避免在批处理文件本身或系统帐户中未定义环境变量。

您的批处理文件仅使用批处理文件本身定义的环境变量。所以这里的建议并不是真的需要。

但是,许多批处理文件在双击时工作正常但未按计划任务运行失败,因为批处理文件依赖于环境变量,如 PATH 或其他与当前用户帐户相关的变量。使用适用于所有帐户的环境变量是安全的,例如 SystemRoot

重新设计的批次代码

这是您的批处理文件,其中包含相应的更改,在批处理文件(希望)作为计划任务工作之前,必须正确设置两个* .vbs文件的路径。

%SystemRoot%\System32\cscript.exe "Path to\Script File\close_outlook.vbs"
%SystemRoot%\System32\ping.exe -n 4 127.0.0.1>nul

set "idrive=\\myserver\drive\Outlook Files"
set "current=C:\myfolder\myuser\Documents\Outlook Files"

echo Start Time of Copy: %time%>>"%idrive%\Log.txt"
copy /B /Y /Z "%current%\archive.pst" "%idrive%\archive.pst"
echo End Time of Copy: %time%>>"%idrive%\Log.txt"

move "%idrive%\Log.txt" "%idrive%\BackupLogs\Log.txt"
ren "%idrive%\BackupLogs\Log.txt" %date:~10,4%-%date:~4,2%-%date:~7,2%_log.txt

%SystemRoot%\System32\cscript.exe "Path to\Script File\open_outlook.vbs"

set "idrive="
set "current="

答案 1 :(得分:0)

在查看之前的回复时,我已将批处理文件缩短为仅下面的代码。这在双击时有效,但在安排任务时则无效。我也尝试过将.vbs脚本移动到网络驱动器的相同任务。同样的结果。

%SystemRoot%\System32\cscript.exe "C:\OutlookBackup\close_outlook.vbs"
%SystemRoot%\System32\ping.exe -n 4 127.0.0.1>nul
%SystemRoot%\System32\cscript.exe "C:\OutlookBackup\open_outlook.vbs"