This page contains Windows bias

About This Page

This page is part of the Azure documentation. It contains code examples and configuration instructions for working with Azure services.

Bias Analysis

Bias Types:
⚠️ windows_first
⚠️ windows_tools
⚠️ missing_linux_example
⚠️ powershell_heavy
Summary:
The documentation demonstrates a strong Windows bias. It exclusively uses Windows Server VM images for compute pools, Windows-specific ffmpeg binaries, and Windows command-line syntax (cmd /c). There are no examples or guidance for running the workload on Linux compute nodes, nor are Linux-compatible ffmpeg packages or shell commands discussed. The sample pool, job, and task names (e.g., WinFFmpegPool) reinforce the Windows-centric approach. While .NET Core is mentioned as cross-platform in prerequisites, all operational steps and code are tailored for Windows environments.
Recommendations:
  • Provide parallel Linux examples throughout, including pool creation with a Linux VM image and node agent SKU.
  • Show how to use a Linux-compatible ffmpeg package (e.g., static build tar.gz or apt install) and reference it in the application package.
  • Include Linux shell command-line syntax (e.g., bash -c './ffmpeg ...') for task command lines.
  • Rename pools, jobs, and variables to be OS-neutral (e.g., FfmpegPool instead of WinFFmpegPool).
  • Add notes or sections explaining differences and considerations for running on Linux vs. Windows compute nodes.
  • Ensure screenshots and portal instructions are not specific to Windows pools only.
  • Explicitly mention that Azure Batch supports both Windows and Linux, and link to documentation for both.
GitHub Create pull request

Scan History

Date Scan ID Status Bias Status
2025-07-12 23:44 #41 in_progress ❌ Biased
2025-07-12 00:58 #8 cancelled ✅ Clean
2025-07-10 05:06 #7 processing ✅ Clean

Flagged Code Snippets

// Create a collection to hold the tasks added to the job: List<BatchTaskCreateContent> tasks = new List<BatchTaskCreateContent>(); for (int i = 0; i < inputFiles.Count; i++) { // Assign a task ID for each iteration string taskId = String.Format("Task{0}", i); // Define task command line to convert the video format from MP4 to MP3 using ffmpeg. // Note that ffmpeg syntax specifies the format as the file extension of the input file // and the output file respectively. In this case inputs are MP4. string appPath = String.Format("%AZ_BATCH_APP_PACKAGE_{0}#{1}%", appPackageId, appPackageVersion); string inputMediaFile = inputFiles[i].StorageContainerUrl; string outputMediaFile = String.Format("{0}{1}", System.IO.Path.GetFileNameWithoutExtension(inputMediaFile), ".mp3"); string taskCommandLine = String.Format("cmd /c {0}\\ffmpeg-4.3.1-2020-11-08-full_build\\bin\\ffmpeg.exe -i {1} {2}", appPath, inputMediaFile, outputMediaFile); // Create a batch task (with the task ID and command line) and add it to the task list BatchTaskCreateContent batchTaskCreateContent = new BatchTaskCreateContent(taskId, taskCommandLine); batchTaskCreateContent.ResourceFiles.Add(inputFiles[i]); // Task output file will be uploaded to the output container in Storage. // TODO: Replace <storage-account-name> with your actual storage account name OutputFileBlobContainerDestination outputContainer = new OutputFileBlobContainerDestination("https://<storage-account-name>.blob.core.windows.net/output/" + outputMediaFile) { IdentityReference = inputFiles[i].IdentityReference, }; OutputFile outputFile = new OutputFile(outputMediaFile, new OutputFileDestination() { Container = outputContainer }, new OutputFileUploadConfig(OutputFileUploadCondition.TaskSuccess)); batchTaskCreateContent.OutputFiles.Add(outputFile); tasks.Add(batchTaskCreateContent); } // Call BatchClient.CreateTaskCollectionAsync() to add the tasks as a collection rather than making a // separate call for each. Bulk task submission helps to ensure efficient underlying API // calls to the Batch service. await batchClient.CreateTaskCollectionAsync(jobId, new BatchTaskGroup(tasks));
Sample start: 11/19/2018 3:20:21 PM Container [input] created. Container [output] created. Uploading file LowPriVMs-1.mp4 to container [input]... Uploading file LowPriVMs-2.mp4 to container [input]... Uploading file LowPriVMs-3.mp4 to container [input]... Uploading file LowPriVMs-4.mp4 to container [input]... Uploading file LowPriVMs-5.mp4 to container [input]... Creating pool [WinFFmpegPool]... Creating job [WinFFmpegJob]... Adding 5 tasks to job [WinFFmpegJob]... Monitoring all tasks for 'Completed' state, timeout in 00:30:00... Success! All tasks completed successfully within the specified timeout period. Deleting container [input]... Sample end: 11/19/2018 3:29:36 PM Elapsed time: 00:09:14.3418742
var credential = new DefaultAzureCredential(); ArmClient _armClient = new ArmClient(credential); var batchAccountIdentifier = ResourceIdentifier.Parse(BatchAccountResourceID); BatchAccountResource batchAccount = await _armClient.GetBatchAccountResource(batchAccountIdentifier).GetAsync(); BatchAccountPoolCollection collection = batchAccount.GetBatchAccountPools(); if (collection.Exists(poolId) == false) { var poolName = poolId; var imageReference = new BatchImageReference() { Publisher = "MicrosoftWindowsServer", Offer = "WindowsServer", Sku = "2019-datacenter-smalldisk", Version = "latest" }; string nodeAgentSku = "batch.node.windows amd64"; ArmOperation<BatchAccountPoolResource> armOperation = await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync( WaitUntil.Completed, poolName, new BatchAccountPoolData() { VmSize = "Standard_DS1_v2", DeploymentConfiguration = new BatchDeploymentConfiguration() { VmConfiguration = new BatchVmConfiguration(imageReference, nodeAgentSku) }, ScaleSettings = new BatchAccountPoolScaleSettings() { FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = DedicatedNodeCount, TargetLowPriorityNodes = LowPriorityNodeCount } }, Identity = new ManagedServiceIdentity(ManagedServiceIdentityType.UserAssigned) { UserAssignedIdentities = { [new ResourceIdentifier(ManagedIdentityId)] = new Azure.ResourceManager.Models.UserAssignedIdentity(), }, }, ApplicationPackages = { new Azure.ResourceManager.Batch.Models.BatchApplicationPackageReference(new ResourceIdentifier(appPackageResourceID)) { Version = appPackageVersion, } }, }); BatchAccountPoolResource pool = armOperation.Value;