如果双击批处理文件 运行 正常,但在 Windows 计划任务中 运行
Batch File running fine if double-clicked but does not run in Windows Scheduled Task
我的 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
1。指定批处理文件中的所有文件以完整路径作为计划任务执行。
双击批处理文件通常会生成 运行 批处理文件,当前工作目录是批处理文件所在的目录。但是当运行一个批处理文件作为计划任务时,Windows的system32目录就是当前工作目录。
close_outlook.vbs
和open_outlook.vbs
是否在Windows的system32目录中?
我不这么认为。在Path to\Script File
下面的批处理代码中按正确路径替换两次
2。将带有 space 的字符串值分配给正确的环境变量。
variable=value
是命令 set 的参数。有
set idrive="\myserver\drive\Outlook Files\"
您将值 "\myserver\drive\Outlook Files\"
赋值给 变量 idrive
,并包含双引号。这导致
的扩展
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
之后的第二个反斜杠和文件夹路径末尾的反斜杠。
由于环境变量现在包含带有 space(s) 且不带双引号的路径,因此必须在环境变量的值与文件名连接使用的地方添加双引号,请参阅批处理代码下面。
使用 "variable=value"
还有一个原因。如果不使用双引号或使用错误,批处理文件中带有命令 set 的行末尾不可见的尾随 space 也会附加到环境变量的值中。阅读 this answer 以了解有关将字符串值正确分配给环境变量的详细信息。
3。使用命令 ping 更好地定义等待循环。
命令
ping localhost > nul
产生等待。但是最好使用类似
的东西
%SystemRoot%\System32\ping.exe -n 4 127.0.0.1>nul
因为现在等待被确定为正好 3 秒。
4。不要在标准输出的重定向运算符 > 或 >> 左侧插入 space。
我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="
在查看之前的回复时,我已将批处理文件缩短为仅包含以下代码。这在双击时有效,但在安排任务时无效。我也尝试过将 .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"
我的 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
1。指定批处理文件中的所有文件以完整路径作为计划任务执行。
双击批处理文件通常会生成 运行 批处理文件,当前工作目录是批处理文件所在的目录。但是当运行一个批处理文件作为计划任务时,Windows的system32目录就是当前工作目录。
close_outlook.vbs
和open_outlook.vbs
是否在Windows的system32目录中?
我不这么认为。在Path to\Script File
下面的批处理代码中按正确路径替换两次
2。将带有 space 的字符串值分配给正确的环境变量。
variable=value
是命令 set 的参数。有
set idrive="\myserver\drive\Outlook Files\"
您将值 "\myserver\drive\Outlook Files\"
赋值给 变量 idrive
,并包含双引号。这导致
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
之后的第二个反斜杠和文件夹路径末尾的反斜杠。
由于环境变量现在包含带有 space(s) 且不带双引号的路径,因此必须在环境变量的值与文件名连接使用的地方添加双引号,请参阅批处理代码下面。
使用 "variable=value"
还有一个原因。如果不使用双引号或使用错误,批处理文件中带有命令 set 的行末尾不可见的尾随 space 也会附加到环境变量的值中。阅读 this answer 以了解有关将字符串值正确分配给环境变量的详细信息。
3。使用命令 ping 更好地定义等待循环。
命令
ping localhost > nul
产生等待。但是最好使用类似
的东西%SystemRoot%\System32\ping.exe -n 4 127.0.0.1>nul
因为现在等待被确定为正好 3 秒。
4。不要在标准输出的重定向运算符 > 或 >> 左侧插入 space。
我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="
在查看之前的回复时,我已将批处理文件缩短为仅包含以下代码。这在双击时有效,但在安排任务时无效。我也尝试过将 .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"