无法使用 Azure Batch Account 任务执行 powershell 脚本

Unable to execute a powershell script using Azure Batch Account task

我正在尝试从批处理池中运行的任务执行 powershell 脚本(我正在使用适用于 .NET 的 Azure 存储客户端库将其上传到存储帐户)。

我知道我正在正确上传 powershell 脚本(我可以通过登录到 Azure 并验证 .ps1 脚本存在于存储帐户中来验证这一点),以及池、作业和任务已正确创建,但我怀疑我发送给任务的实际命令不正确,这就是我的任务出错的原因。 (这是下面代码示例中名为 powershellTask​​ 的字符串)

    List<CloudTask> tasks = new List<CloudTask>();
    string inputFileName = inputFiles[0].FilePath;
    string powershellTask = $"powershell {inputFileName}";
    CloudTask task = new CloudTask("Test-Powershell-Execution-Task", 
       powershellTask);
    task.ResourceFiles = new List<ResourceFile> {inputFiles[0]};
    tasks.Add(task);
    batchClient.JobOperations.AddTask(JobId, tasks);

powershell 脚本之前在代码中已上传到 azure 存储(我可以验证是否已正确上传):

foreach (string filePath in inputFilePaths)
{
    inputFiles.Add(UploadFileToContainer(blobClient, inputContainerName, filePath));
}

private static ResourceFile UploadFileToContainer(CloudBlobClient blobClient, string containerName, string filePath)
{
    Console.WriteLine("Uploading file {0} to container [{1}]...", filePath, containerName);

    string blobName = Path.GetFileName(filePath);
    filePath = Path.Combine(Environment.CurrentDirectory, filePath);

        CloudBlobContainer container = 
            blobClient.GetContainerReference(containerName);
            CloudBlockBlob blobData = container.GetBlockBlobReference(blobName);
            blobData.UploadFromFileAsync(filePath).Wait();

            SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy
            {
                SharedAccessExpiryTime = DateTime.UtcNow.AddHours(2),
                Permissions = SharedAccessBlobPermissions.Read
            };

            // Construct the SAS URL for blob
            string sasBlobToken = blobData.GetSharedAccessSignature(sasConstraints);
            string blobSasUri = String.Format("{0}{1}", blobData.Uri, sasBlobToken);

            return ResourceFile.FromUrl(blobSasUri, filePath);
}

池、作业和任务都已正确创建。 但是,当我在 Azure 上单击我的任务时,我收到了消息。 "There is an error encountered when processing your request, please try again" Azure 似乎没有提供有关请求问题的更多信息。 当我终止任务时,我无法获得任何进一步的信息,因为终止任务会引发异常。 “抛出异常试图从已完成的任务中确定信息 消息:操作返回无效状态代码 'Conflict'"

如果有人有任何想法或可以指出有关在 Azure 批处理过程中上传和执行 powershell 脚本的进一步文档的方向,那将不胜感激。谢谢!

编辑: 感谢@Hydraxy 的回复,让我在这方面取得了进一步的进步(真的很有帮助,特别是告诉我不要在代码末尾删除任务)。

正如推测的那样,该任务正在运行。问题是我的代码只是试图解析 stdout.txt,而不是 stderr.txt.

当我在 Azure 门户上查看 stderr.txt 时,我看到了我的错误:

Invoke-Sqlcmd : The term 'Invoke-Sqlcmd' is not recognized as the name of a cmdlet, function, 
script file, or operable program. Check the spelling of the name, or if a path was included, 
verify that the path is correct and try again.
At D:\Dev\codebase\BatchesInAzure\BatchesInAzure\bin\Debug\netcoreapp2.1\BatchesInAzure.ps1:1 
char:1
+ Invoke-Sqlcmd -ServerInstance "dev-database" -Database "Dayinsure.Ap ...
+ ~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Invoke-Sqlcmd:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

看来,我怀疑我的 powershell 脚本不正确。我已经在本地的 powershell 中执行了这个脚本,它总是 returns 结果。 Azure 不支持 Invoke-SqlCmd 吗?

认为分享 BatchesInAzure 的内容可能会有所帮助。ps1 我正在上传并尝试执行的文件(出于显而易见的原因删除了服务器名称、用户名和密码)。

Invoke-Sqlcmd -ServerInstance "my-database-server" -Database "my-lovely-database" -Username "database-user" -Password "super-secure-password" -Query "SELECT GetDate() as TimeOfQuery"

我不确定你的任务是否真的失败了。导航至 UI.

中的任务页面时,您可能会遇到一些间歇性错误

终止任务时出现的错误:"Message: Operation returned an invalid status code 'Conflict'" 表明当您尝试终止任务时,该任务可能已经完成。您应该能够检查 task.ExecutionInformation 以查看任务的退出代码,或使用像 Azure 门户这样的 UI 来查看结果。

能否分享您看到错误的门户页面的屏幕截图?

此外,如果您重现问题并留下任务(即不删除作业和任务),如果问题仍然存在,我可以帮助进一步调试。请注意,您无需为离开 jobs/tasks 而付费,因此无需支付任何费用。一旦我们诊断出了问题,您就可以将其删除。