如何在 Windows 任务调度程序上安排 azcopy?

Posted

技术标签:

【中文标题】如何在 Windows 任务调度程序上安排 azcopy?【英文标题】:How to schedule azcopy on windows task schedueler? 【发布时间】:2020-06-10 00:56:18 【问题描述】:

目标 将我的虚拟驱动器(Azure 文件共享)同步到 Azure Blob 存储容器

解决方案 对于这个解决方案,我使用的是 azcopy。当我使用我的创建批处理文件运行 azcopy 时,一切运行正常。

但我也想安排这个,就像每晚一样。 为此,我将使用 Windows 任务调度程序。

Windows 任务调度程序正确运行 bat 文件。我的 bat 文件还创建了一个日志文件。当我手动运行与任务调度程序运行时,日志文件中的输出是不同的。

批处理文件:

@echo off
IF EXIST C:\inetpub\wwwroot\tasks\azcopy_logs.txt (
    del C:\inetpub\wwwroot\tasks\azcopy_logs.txt
)
set LOGFILE=C:\inetpub\wwwroot\tasks\azcopy_logs.txt
call :LOG > %LOGFILE%
exit /B

:LOG

SET source="Y:\my-folder"
echo %source%
SET dest=^"https://TEST.blob.core.windows.net/my-container/?sv=2019-02-02^&ss=bfqt^&srt=sco^&sp=rwdlacup^&se=2120-02-26T14:56:15Z^&st=2020-02-26T06:56:10Z^&spr=https^&sig=TEST^"

echo %dest%

azcopy.exe sync %source% %dest%


exit

手动运行时的输出

"Y:\my-folder"
"https://TEST.blob.core.windows.net/my-container/?sv=2019-02-02&ss=bfqt&srt=sco&sp=rwdlacup&se=2120-02-26T14:56:15Z&st=2020-02-26T06:56:10Z&spr=https&sig=TEST"

Job a84acee9-1796-f44b-4852-530d052db5a0 has started
Log file is located at: C:\Users\x\.azcopy\a84acee9-1796-f44b-4852-530d052db5a0.log


0 Files Scanned at Source, 0 Files Scanned at Destination
334 Files Scanned at Source, 672 Files Scanned at Destination, 2-sec Throughput (Mb/s): 0
The source and destination are already in sync.

任务调度程序运行的输出

"Y:\my-folder"
"https://TEST.blob.core.windows.net/my-container/?sv=2019-02-02&ss=bfqt&srt=sco&sp=rwdlacup&se=2120-02-26T14:56:15Z&st=2020-02-26T06:56:10Z&spr=https&sig=TEST"

Cannot perform sync due to error: sync must happen between source and destination of the same type, e.g. either file <-> file, or directory/container <-> directory/container

任务调度器 xml 定义

 <?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2020-02-25T13:30:25.4791113</Date>
    <Author>my-user</Author>
    <URI>\azcopy\my task name</URI>
  </RegistrationInfo>
  <Triggers>
    <CalendarTrigger>
      <StartBoundary>2020-02-25T13:29:16</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>my-user-id</UserId>
      <LogonType>Password</LogonType>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>true</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>PT1H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>C:\inetpub\wwwroot\tasks\azcopy.bat</Command>
      <WorkingDirectory>C:\inetpub\wwwroot\tasks\</WorkingDirectory>
    </Exec>
  </Actions>
</Task>

【问题讨论】:

阅读How to Ask 和minimal reproducible example。请将您的任务导出为 XML,edit 您的帖子包含该文件的内容。 你为什么要转义set dest=^"...中的引号? 如果我不转义引号,azcopy 也会通过运行批处理文件手册返回错误:AuthenticationErrorDetail: Signature fields not well formed. 改用set "dest=..."。或者只是删除它们。 发布minimal reproducible example,而不仅仅是来自任务调度程序 XML 的 Action 块。 【参考方案1】:

终于找到并解决了问题。

Windows 任务计划程序无权访问已装载的 azure 文件共享驱动器。

解决方案: 将源驱动器 (SET source="Y:\my-folder") 更改为 UNC 路径 (SET source="\TEST.file.core.windows.net\my-container\my-folder")

【讨论】:

以上是关于如何在 Windows 任务调度程序上安排 azcopy?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Windows 任务调度程序在(ubuntu bash windows 10)上运行程序

如何在 Heroku 上安排“每周”工作?

如何在特定时间安排任务?

如何使用 Laravel 在 Windows 10 中运行任务调度程序

通过 Windows 任务计划程序安排在 Anaconda 中开发的脚本

如何安排不使用Windows任务计划程序运行bat文件?