PowerShell调用Azure OpenAI报错:找不到接受参数的位置参数
解决Azure OpenAI请求的PowerShell位置参数错误
问题场景
执行以下PowerShell命令调用Azure OpenAI的Completions API时:
curl ${OPENAI_API_BASE%/}/openai/deployments/try-davinci/completions?api-version=2022-06-01-preview -H @{"Content-Type"="application/json";"Authorization"= "Bearer $accessToken"} -d '{ "prompt": "Tell me a funny story." }'
收到报错:
Invoke-WebRequest : A positional parameter cannot be found that accepts argument '{ "prompt": "Tell me a funny story."'. At line:1 char:1 + curl ${OPENAI_API_BASE%/}/openai/deployments/try-davinci/completions? ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Invoke-WebRequest], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
报错原因
PowerShell中curl是Invoke-WebRequest的别名,而非原生curl工具,两者参数语法差异导致解析失败:
-H参数的哈希表格式未正确包裹,被PowerShell错误拆分;- 请求体内容的引号处理不符合PowerShell规则,被误认为位置参数;
- URL中的变量展开和路径截断语法是bash风格,PowerShell无法识别。
解决方案
方法1:使用PowerShell原生Invoke-WebRequest语法
# 定义请求头和请求体 $requestHeaders = @{ "Content-Type" = "application/json" "Authorization" = "Bearer $accessToken" } $requestBody = '{ "prompt": "Tell me a funny story." }' # 拼接正确的API地址,移除末尾斜杠 $apiUrl = "$($OPENAI_API_BASE.TrimEnd('/'))/openai/deployments/try-davinci/completions?api-version=2022-06-01-preview" # 发送请求 Invoke-WebRequest -Uri $apiUrl -Headers $requestHeaders -Method Post -Body $requestBody
方法2:调用系统原生curl.exe(需环境支持)
如果系统已安装原生curl(如Windows 10 1803+、Git Bash或Linux环境),直接指定curl.exe避免PowerShell别名干扰:
curl.exe "$($OPENAI_API_BASE.TrimEnd('/'))/openai/deployments/try-davinci/completions?api-version=2022-06-01-preview" ` -H "Content-Type: application/json" ` -H "Authorization: Bearer $accessToken" ` -d '{ "prompt": "Tell me a funny story." }'
关键修正说明
- 单独定义请求头和请求体变量,避免参数解析混乱;
- 使用PowerShell的
TrimEnd('/')替代bash的路径截断语法处理URL; - 用双引号包裹API地址,确保变量
$OPENAI_API_BASE正常展开; - 调用原生curl时必须指定
curl.exe,避免触发PowerShell的Invoke-WebRequest别名。
内容的提问来源于stack exchange,提问作者Manu Chadha
相关产品推荐
相关产品推荐

