Batch file 从windows计划程序运行批处理文件时出现异常行为

Batch file 从windows计划程序运行批处理文件时出现异常行为,batch-file,scheduled-tasks,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%

我想定义一个计划作业,每周五备份所有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)

我的操作系统是:Windows7企业版

手动运行任务时,结果相同(空文件夹)

为任务导出的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>

2014-07-15T14:02:04.1374691
VF-EG\AWAHA20
2014-07-18T23:00:00
符合事实的
1.
VF-EG\AWAHA20
S4U
高可用性
无知的新
符合事实的
符合事实的
符合事实的
错误的
错误的
符合事实的
错误的
符合事实的
符合事实的
错误的
错误的
错误的
P3D
7.
D:\SVN\backupSVN.bat

您没有指定操作系统,但这与W2k之后的所有操作系统几乎相同

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

如果右键单击>运行,任务是否有效


此外,如果您已获得Win 7,您可以右键单击>“导出…”,然后将其粘贴到问题中以提供帮助。

对于此类问题的唯一解释是权限问题:调度程序任务在权限低于命令提示符的用户下运行。 升级运行计划程序服务的用户,或授予当前用户对
D:\SVN\u常规\u备份
D:\SVN\Repositories
的“修改”权限三件事:

与此相反:

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_%,它将一事无成

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
)

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

在任务调度程序的“操作”选项卡中,双击该操作,出现一个“开始(可选)”,我将脚本的路径放在那里,它就工作了


希望对您有所帮助。

任务由同一个用户(我的)运行,我是“D:\SVN\u REGULAR\u BACKUP”目录的创建者,请在我的编辑中检查导出的任务xml,它可能会导致提示或其他问题。您能启用任务历史记录并检查是否记录了任何错误吗?谢谢,操作系统是windows 7,我导出了任务并将其添加到Q,在没有帮助的情况下,我选中了“无论用户是否登录都运行”和“以最高权限运行”,手动运行任务会导致相同的结果(空文件夹)。重新阅读后,我意识到任务正在运行,因为文件夹已创建。我会像Alireza说的那样拥有下一个权限。如果在批处理文件和计划任务中只运行硬编码版本的行
svnadmin dump%source\u dir%\%%a>%backup\u dir%\%backuptime%\%%a\u dump\uuu%backuptime%.svn\u dump
,会发生什么?我仅使用此行创建了一个硬编码批处理文件,其状态为(0X1),并创建了一个空的转储文件(0KB),在任务历史记录中,我发现:“action”C:\Windows\SYSTEM32\cmd.exe“返回代码为1”。您认为如何?您能直接从命令提示符获得硬编码行吗?如果不是,那么我认为问题出在SVN命令上,而不是批处理文件或计划任务。你说当我手动运行任务时,它会产生相同的结果(空文件夹),所以故障不在任务计划程序上,对吗?@foxidrive我的意思是当我右键单击任务并选择运行时,当我执行bat文件时,结果正常。请确认在资源管理器中单击或从cmd提示符中单击批处理文件时,批处理文件功能正常。@foxidrive是的,它运行正常,并完成了应该执行的操作。感谢所有有用的注释,我都应用了它们,但运气不佳,从task scheduler运行脚本仍然只会创建一个空文件夹,并删除网络或本地驱动器上的一个旧文件夹?默认情况下,任务计划程序无权访问网络。我在通过远程桌面访问的windows server计算机上配置、计划、运行,但脚本在本地运行,并访问安装在同一服务器计算机上的SVN。我创建了一个硬编码批处理文件,其中有一行为1个代表创建转储,它已完成状态(0X1),并创建了一个空转储文件(0KB),在任务历史记录中我发现:“action”C:\Windows\SYSTEM32\cmd.exe,返回代码为1“。您认为如何?