Subchapter 49.3
references/long-comments-on-windows.mdMarkdown3 KBView on GitHub
On Windows the az command resolves to az.cmd, a batch wrapper invoked by cmd.exe. The whole command line is capped at ~8191 characters, so a long --discussion, , or value can be silently truncated or fail. Detect the shell before composing a long argument and route accordingly. Skipping this is the most common reason the agent burns 3-5 turns falling back to raw token retrieval and REST calls.
--description--content| Environment | Signal | Action |
|---|---|---|
| PowerShell on Windows | $IsWindows -eq $true and $PSVersionTable.PSVersion is set | Use azps.ps1 (see below) |
| PowerShell on macOS / Linux | $IsWindows -eq $false | Plain az is fine, no cmd.exe wrapper |
| bash / zsh / sh | $BASH_VERSION or $ZSH_VERSION set, or uname works | Plain az is fine, no cmd.exe wrapper |
Windows cmd.exe | %ComSpec% ends in cmd.exe, no $PSVersionTable | Use azps.ps1 if PowerShell is installed, otherwise see az devops invoke fallback below |
azps.ps1 ships with the Azure CLI installer and invokes the Python entry point directly. No cmd.exe length cap.
# Read the long body into a variable and pass it through. No quoting headaches.
$body = Get-Content -Raw .\comment.md
azps.ps1 boards work-item update --id 1234 --discussion $bodySome commands have a native file flag and you should prefer it over any inline body:
az devops wiki page create and az devops wiki page update take --file-path (with optional --encoding).az devops wiki page create --path 'My page' --wiki myproject --file-path ./page.md --encoding utf-8When no --file-path exists (work-item --discussion, PR --description) and you’re not in PowerShell, post the body via the underlying REST API. az devops invoke runs inside the Python entry point, so it isn’t subject to the cmd.exe cap either, and it takes the request body from a file with --in-file:
# Post a long discussion comment to work item 1234.
# REST: POST /{project}/_apis/wit/workItems/{id}/comments?api-version=7.0-preview.3
az devops invoke \
--area wit --resource comments \
--route-parameters project={project} workItemId=1234 \
--api-version 7.0-preview.3 \
--http-method POST \
--in-file ./comment.jsonWhere comment.json is { "text": "<long markdown body>" }. This is the universal escape hatch when neither azps.ps1 nor --file-path is available. az devops invoke itself accepts --in-file natively.
The Azure CLI @<file> convention is documented for JSON parameters (see the official quoting guide (opens in a new tab)). It is not guaranteed to expand plain string args like --discussion or --description, so don’t reach for it as a substitute for the three options above.