如何解压缩并执行作为Azure Data Factory一部分的批处理服务作业

时间:2019-05-05 19:22:37

标签: azure cmd unzip azure-data-factory azure-batch

Azure Data Factory可以将自定义活动作为批处理服务作业执行。这些作业可以从存储帐户中的.exe(及相关的依赖项)运行,并在执行之前复制到整个帐户。

存储帐户中可以使用的文件受到限制:

  

resourceFiles的总大小不能超过32768个字符

解决方案似乎是将文件压缩到存储帐户中,并作为命令的一部分解压缩。 This post建议在Azure数据工厂中以以下方式运行批处理服务命令:

  

Unzip.exe [myZipFilename] && MyExeName.exe [cmdLineArgs]

在Windows 10计算机上本地运行此程序效果很好。在批处理服务自定义活动(使用Cloud Services Windows Server 2019 OS映像应用程序池)上将此设置为Command参数会导致:

  

警告:文件名不匹配:&&

感觉上好像缺少一些基本的东西,但是我尝试了各种排列,但无法使其正常工作。

3 个答案:

答案 0 :(得分:3)

分享几乎没有什么可能发生的可能性,我同意缺少一些小东西,如果您想共享所尝试的确切命令行,则可以随意共享。

很少有可能导致这种行为的想法:

  • 请从cmd /c "Unzip.exe [myZipFilename] && MyExeName.exe [cmdLineArgs]"

  • 的角度出发,在引号中尝试使用命令行
  • 确保您的文件存在,即一种可能性是:最后,该命令尝试使用&&cmd /c "unzip.exe "empty" && ...

  • 运行一个空字符串

希望上述2个修复程序之一,或者随时添加更多细节等。

答案 1 :(得分:2)

在不了解ADF在Windows批处理服务节点上运行自定义活动命令的上下文的情况下,我更改了设置以避免期望Unzip.exe存在(在cmd /c "Unzip.exe"下运行时似乎不存在)仅以Unzip.exe作为命令)。

现在支持自定义活动的存储帐户内容包括:

  • executable.zip(我的.NET Core控制台应用程序是为具有所有依赖项的Windows发布的)
  • unzip.exe(取自本地计算机上的Git Bash)
    • 包括msys-2.0.dll和msys-bz2-1.dll依赖项

那么ADF中的命令是:

cmd /c "Unzip.exe executable-with-deps.zip && executable.exe"

答案 2 :(得分:0)

我遇到了同样的问题,并用一个简短的 powershell 脚本解决了它,该脚本提取了我的 zip 文件并启动了我的程序。通用脚本看起来像(称为 unzipandrun.ps1):

[CmdletBinding()]
param (    
    [Parameter(Mandatory = $true)][String]$zipFile,    
    [Parameter(Mandatory = $true)][String]$executable,    
    [Parameter(Mandatory = $true)][String]$prm
)
#######
# Unzip
#######
Add-Type -AssemblyName System.IO.Compression.FileSystem
function Unzip
{
    param([string]$zipfile, [string]$outpath)
    [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath)
}
"Start Unzip $zipFile" | Write-Host
Unzip $zipFile $pwd
###########
# Start exe
###########
"Start $executable $prm" | Write-Host
$cmd = "& $executable $prm"
Invoke-Expression $cmd

因此,如果我想在 azure 批处理上使用参数 /t 123 启动 myapp.exe,我将启动:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "unzipandrun.ps1 '/t 123'"