Я пытаюсь выполнить сценарий 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, это было бы очень полезно. Спасибо!
EDIT:
Спасибо @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"