我想定义一个预定作业来每周五备份所有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>
答案 0 :(得分:0)
你没有指定操作系统,但是从W2k开始,这几乎完全相同。
检查计划任务是否设置为“运行用户是否登录”,并确保您输入的凭据具有管理权限(可能没有必要,但会避免其他问题)。您还可以选中“以最高权限运行”,我认为将该任务作为系统帐户运行。
如果右键单击&gt;该任务是否有效运行
此外,如果你有Win 7,你可以右键单击&gt; “导出...”然后将其粘贴到问题中以帮助解决。
答案 1 :(得分:0)
对此类问题的唯一解释是权限问题:调度程序任务在权限较低的用户下运行,而不是命令提示符。
升级运行调度程序服务的用户,或者在D:\SVN_REGULAR_BACKUP
和D:\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;,我放置了我脚本的路径它有效!
希望对你有所帮助。