You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中使用Invoke-WebRequest传递变量时报错问题排查

PowerShell调用Samsara燃油交易API的变量替换问题解决

问题场景

无硬编码值的脚本可正常运行:

$headers=@{}
$headers.Add("accept", "application/json")
$headers.Add("content-type", "application/json")
$headers.Add("authorization", "$APIToken")
$response = Invoke-WebRequest -Uri 'https://api.samsara.com/fuel-purchase' -Method POST -Headers $headers -ContentType 'application/json' -Body '{"fuelQuantityLiters":"676.8","iftaFuelType":"Diesel","transactionLocation":"350 Rhode Island St, San Francisco, CA 94103","transactionPrice":{"amount":"640.2","currency":"usd"},"transactionReference":"5454534","transactionTime":"2024-02-22T10:20:50.52-06:00","vehicleId":"570"}'

但使用变量替换时出现两类错误:

  1. 找不到接受参数的位置参数:双引号包裹JSON时,未转义内部双引号导致PowerShell错误解析参数边界
# 错误示例
$response = Invoke-WebRequest -Uri 'https://api.samsara.com/fuel-purchase' -Method POST -Headers $headers -ContentType 'application/json' -Body "{"fuelQuantityLiters":$QuantityLiters,"iftaFuelType":$FuelType,"transactionLocation":$StationAddress,"transactionPrice":{"amount":$TransactionSale,"currency":$Currency},"transactionReference":$TransactionID,"transactionTime":$TransactionDateTime,"vehicleId":$Vehicle}"
  1. 无效字符'$',寻找值的起始位置:单引号包裹JSON时,PowerShell不会解析内部变量,导致JSON中直接出现$Variable字符串,破坏JSON格式
# 错误示例
$response = Invoke-WebRequest -Uri 'https://api.samsara.com/fuel-purchase' -Method POST -Headers $headers -ContentType 'application/json' -Body '{"fuelQuantityLiters":$QuantityLiters,"iftaFuelType":$FuelType,"transactionLocation":$StationAddress,"transactionPrice":{"amount":$TransactionSale,"currency":$Currency},"transactionReference":$TransactionID,"transactionTime":$TransactionDateTime,"vehicleId":$Vehicle}'

解决方案

方案1:使用对象转JSON(推荐)

通过创建PowerShell对象映射API请求结构,再转换为JSON字符串,彻底避免引号和格式问题:

$headers = @{}
$headers.Add("accept", "application/json")
$headers.Add("content-type", "application/json")
$headers.Add("authorization", "$APIToken")

# 定义业务变量(替换为实际值)
$QuantityLiters = "676.8"
$FuelType = "Diesel"
$StationAddress = "350 Rhode Island St, San Francisco, CA 94103"
$TransactionSale = "640.2"
$Currency = "usd"
$TransactionID = "5454534"
$TransactionDateTime = "2024-02-22T10:20:50.52-06:00"
$Vehicle = "570"

# 构建请求体对象,完全匹配API要求的结构
$fuelPurchaseBody = [PSCustomObject]@{
    fuelQuantityLiters = $QuantityLiters
    iftaFuelType = $FuelType
    transactionLocation = $StationAddress
    transactionPrice = [PSCustomObject]@{
        amount = $TransactionSale
        currency = $Currency
    }
    transactionReference = $TransactionID
    transactionTime = $TransactionDateTime
    vehicleId = $Vehicle
}

# 转换为JSON字符串(-Depth 3确保嵌套对象被正确转换)
$jsonBody = $fuelPurchaseBody | ConvertTo-Json -Depth 3

# 发送API请求
$response = Invoke-WebRequest -Uri 'https://api.samsara.com/fuel-purchase' -Method POST -Headers $headers -ContentType 'application/json' -Body $jsonBody

方案2:手动转义引号并插值

如果需要直接拼接字符串,需用反引号`转义JSON内部的双引号,同时为字符串类型变量添加引号:

$response = Invoke-WebRequest -Uri 'https://api.samsara.com/fuel-purchase' -Method POST -Headers $headers -ContentType 'application/json' -Body "{""fuelQuantityLiters"":""$QuantityLiters"",""iftaFuelType"":""$FuelType"",""transactionLocation"":""$StationAddress"",""transactionPrice"":{""amount"":""$TransactionSale"",""currency"":""$Currency""},""transactionReference"":""$TransactionID"",""transactionTime"":""$TransactionDateTime"",""vehicleId"":""$Vehicle""}"

API说明(中文翻译)

Samsara燃油交易提交API要求请求体包含以下必填字段:

  • fuelQuantityLiters:燃油购买量(单位:升)
  • iftaFuelType:燃油类型(例如Diesel)
  • transactionLocation:交易地点地址
  • transactionPrice:嵌套对象,包含交易金额amount和货币代码currency(例如usd)
  • transactionReference:交易唯一参考ID
  • transactionTime:交易时间(需符合ISO 8601格式,如2024-02-22T10:20:50.52-06:00)
  • vehicleId:本次加油关联的车辆ID

内容的提问来源于stack exchange,提问作者JamesD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:27:05