Batch file 从windows计划程序运行批处理文件时出现异常行为
我想定义一个计划作业,每周五备份所有SVN存储库 因此,我创建了以下批处理文件: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%
@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“。您认为如何?