Я пытаюсь выполнить сценарий PowerShell (который я загружаю в учетную запись хранения с помощью клиентской библиотеки хранилища Azure для .NET) из задачи, которая выполняется в пуле пакетной службы.
Я знаю, что загружаю сценарий 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, я получаю сообщение. «При обработке вашего запроса произошла ошибка, попробуйте еще раз» Кажется, Azure не дает мне никакой дополнительной информации о том, что не так с запросом. Когда я завершаю задачу, я не могу получить дополнительную информацию, поскольку завершение задачи вызывает исключение. «Возникла исключительная ситуация при попытке определить информацию из выполненных задач. Сообщение: операция вернула недопустимый код состояния« Конфликт »»
Если у кого-то есть идеи или кто-то может указать мне направление дальнейшей документации по загрузке и выполнению сценариев PowerShell в пакетных процессах Azure, это будет действительно признательно. Спасибо!
РЕДАКТИРОВАТЬ: Спасибо @Hydraxy за ответ ниже и позволивший мне немного продвинуться в этом (было действительно полезно, особенно говоря мне НЕ удалять задачу в конце кода).
Задача, как и предполагалось, БЫЛА работающей. Проблема заключалась в том, что мой код пытался проанализировать только stdout.txt, а не stderr.txt.
Когда я проверил stderr.txt на портале Azure, я увидел свою ошибку:
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 локально, и он всегда возвращает результаты. Invoke-SqlCmd не поддерживается в Azure?
Подумал, что может быть полезно поделиться содержимым файла BatchesInAzure.ps1, который я загружаю и пытаюсь выполнить (по очевидным причинам удалили имена серверов, имена пользователей и пароли).
Invoke-Sqlcmd -ServerInstance "my-database-server" -Database "my-lovely-database" -Username "database-user" -Password "super-secure-password" -Query "SELECT GetDate() as TimeOfQuery"