从Windows调度程序运行批处理文件的奇怪行为

时间:2014-07-18 21:41:59

标签: batch-file scheduled-tasks

我想定义一个预定作业来每周五备份所有SVN存储库

所以我创建了以下批处理文件:

@echo off
CLS 

SET "source_dir=D:\SVN\Repositories"
SET "backup_dir=D:\SVN_REGULAR_BACKUP"
SET MAX_BACKUPS=3

set DD=%DATE:~7,2%
set MM=%DATE:~4,2%
set YY=%DATE:~12,2%
set YYYY=%DATE:~10,4%
set HH=%TIME:~0,2%
set MN=%TIME:~3,2%

SET "backuptime=%YYYY%-%MM%-%DD%_%HH%-%MN%"

mkdir %backup_dir%\%backuptime%

for /f "delims=" %%A in ('dir %source_dir% /ad /b') do (
    mkdir %backup_dir%\%backuptime%\%%A
    svnadmin dump %source_dir%\%%A  > %backup_dir%\%backuptime%\%%A\%%A_dump_%backuptime%.svn_dump
)

for /f "skip=%MAX_BACKUPS% delims=" %%A in ('dir %backup_dir% /ad /b /o-d') do rmdir /s /q "%backup_dir%\%%A"

它工作正常,一旦我执行它,它会创建一个备份并删除第三个旧的(完全按照我的意愿)

但是当它从Windows任务调度程序运行时,它只创建一个空文件夹,并删除第三个文件夹!

对我而言,这是一种非常奇怪的行为,有人可以解释发生了什么吗?

编辑(1)

我的操作系统是:Windows 7企业版

当我手动运行任务时,它会产生相同的(空文件夹)

为任务导出XML:

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2014-07-15T14:02:04.1374691</Date>
    <Author>VF-EG\awahba20</Author>
  </RegistrationInfo>
  <Triggers>
    <CalendarTrigger>
      <StartBoundary>2014-07-18T23:00:00</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByWeek>
        <DaysOfWeek>
          <Friday />
        </DaysOfWeek>
        <WeeksInterval>1</WeeksInterval>
      </ScheduleByWeek>
    </CalendarTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>VF-EG\awahba20</UserId>
      <LogonType>S4U</LogonType>
      <RunLevel>HighestAvailable</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>D:\SVN\backupSVN.bat</Command>
    </Exec>
  </Actions>
</Task>

4 个答案:

答案 0 :(得分:0)

你没有指定操作系统,但是从W2k开始,这几乎完全相同。

检查计划任务是否设置为“运行用户是否登录”,并确保您输入的凭据具有管理权限(可能没有必要,但会避免其他问题)。您还可以选中“以最高权限运行”,我认为将该任务作为系统帐户运行。

如果右键单击&gt;该任务是否有效运行

此外,如果你有Win 7,你可以右键单击&gt; “导出...”然后将其粘贴到问题中以帮助解决。

答案 1 :(得分:0)

对此类问题的唯一解释是权限问题:调度程序任务在权限较低的用户下运行,而不是命令提示符。 升级运行调度程序服务的用户,或者在D:\SVN_REGULAR_BACKUPD:\SVN\Repositories上授予当前用户“修改”权限

答案 2 :(得分:0)

三件事:

而不是:

SET backuptime="%YYYY%-%MM%-%DD%_%HH%-%MN%"

如下所示双重引用项目,不包括变量中的双引号 Windows容忍奇怪的双引号 - 大部分时间......某些工具会失败。

SET "backuptime=%YYYY%-%MM%-%DD%_%HH%-%MN%"

这不使用简短的开关,而且是冗余代码。

FOR /F %%A in ('dir %backup_dir% /A:D') do set count=%%A
set /a count=count
set /a count=count-2
事实上这就是你所需要的,因为如果小于%max_backups%,它就不会做任何事情。

for /f "skip=%MAX_BACKUPS% delims=" %%A in ('dir %backup_dir% /ad /b /o-d') do rmdir /s /q "%backup_dir%\%%A"

在本节中,如果任何文件夹包含空格或&等,则需要“delims =” 你的双引号确实需要进一步的工作。

for /f "delims=" %%A in ('dir %source_dir% /ad /b') do (
    mkdir %backup_dir%\%backuptime%\%%A
    svnadmin dump %source_dir%\%%A  > %backup_dir%\%backuptime%\%%A_dump_%backuptime%.svn_dump
)

答案 3 :(得分:0)

我有完全相同的奇怪行为,但我需要做的就是:

在任务计划程序,选项卡&#39;操作&#39;中,双击该操作,然后有一个&#34;开始(可选)&#34;,我放置了我脚本的路径它有效!

希望对你有所帮助。