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"}'
但使用变量替换时出现两类错误:
- 找不到接受参数的位置参数:双引号包裹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}"
- 无效字符'$',寻找值的起始位置:单引号包裹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:交易唯一参考IDtransactionTime:交易时间(需符合ISO 8601格式,如2024-02-22T10:20:50.52-06:00)vehicleId:本次加油关联的车辆ID
内容的提问来源于stack exchange,提问作者JamesD
相关产品推荐
相关产品推荐

