无法使用Azure批处理帐户任务执行Powershell脚本

时间:2019-05-16 14:52:00

标签: c# azure powershell azure-batch

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

我知道我正在正确上传powershell脚本(我可以通过登录到Azure并验证存储帐户中是否存在.ps1脚本来验证这一点),并且正确创建了Pool,Job和Task。怀疑我发送给任务的实际命令不正确,这就是为什么我的任务出错。 (在下面的代码示例中,这是名为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上的任务时,会收到消息。 “处理您的请求时遇到错误,请重试” 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中本地执行了此脚本,并且始终返回结果。 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"

1 个答案:

答案 0 :(得分:0)

我不确定您的任务是否实际失败。导航到UI中的任务页面时,您可能会遇到一些间歇性错误。

终止任务时遇到的错误:“消息:操作返回了无效的状态代码'冲突'”,这表明尝试终止该任务时,该任务可能已经完成。您应该能够检查task.ExecutionInformation来查看任务的退出代码,或者使用类似Azure门户的UI来查看结果。

您可以分享看到错误的门户页面的屏幕截图吗?

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