【问题标题】:Batch File running fine if double-clicked but does not run in Windows Scheduled Task如果双击批处理文件运行良好但不在 Windows 计划任务中运行
【发布时间】:2015-04-22 15:46:00
【问题描述】:

我的 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

【问题讨论】:

  • 计划任务是否在您的用户帐户下运行?
  • 我建议将文件保存在非系统(不是 C)驱动器上。 C: 驱动器需要管理员权限。
  • 您是否检查过计划任务是否在您的用户帐户下运行?为什么不在您离开计算机更长时间之前关闭 Outlook?
  • 是的。该任务正在我的用户帐户下运行。我可以在任务运行之前关闭 Outlook。我也可以每天早上去喝咖啡时手动运行批处理文件(我目前的方法)。但我只是想弄清楚如何通过计划任务完成这项工作。 :-)
  • 好吧,当批处理文件在您的计算机上作为计划任务执行时,我们几乎不可能找出问题所在。我建议附加到批处理文件>>C:\Temp\Output.txt 2>>C:\Temp\Errors.txt 的每一行,并确保存在一个目录C:\Temp,并且每个人都有写权限。也许您可以在 2 个文件上看到当批处理文件作为计划任务执行时,哪些文件不起作用。

标签: batch-file vbscript scheduled-tasks


【解决方案1】:

在查看之前的回复时,我已将批处理文件缩短为仅以下代码。这在双击时有效,但在安排任务时无效。我也尝试过将 .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"

【讨论】:

    【解决方案2】:

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

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

    close_outlook.vbsopen_outlook.vbs在Windows的system32目录下吗?

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

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

    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 之后的第二个反斜杠和文件夹路径末尾的反斜杠。

    由于环境变量现在包含带空格且不带双引号的路径,因此必须在环境变量的值与文件名连接的地方添加双引号,请参见下面的批处理代码。

    使用"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="
    

    【讨论】:

    • 哇!非常感谢您的详细回复。对于延迟回复,我深表歉意。这是我的第一篇文章,虽然我选中了要在回复时通过电子邮件发送的框,但我没有收到电子邮件。我今天碰巧检查并在我的收件箱中看到了这个回复。再次谢谢你。不幸的是,在将代码更改为您的代码后,我仍然遇到同样的问题。当我将批处理文件作为计划任务运行时,Outlook 没有关闭。不过,新批次也可以在双击时工作。
    猜你喜欢
    • 2014-09-14
    • 2013-03-01
    • 2014-03-15
    • 2012-09-12
    • 2015-02-23
    • 2014-12-12
    • 2023-02-22
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多