【问题标题】:String Building Issue in PowershellPowershell 中的字符串构建问题
【发布时间】:2015-07-22 14:52:51
【问题描述】:

我正在尝试参数化一个 powershell 脚本。唯一的问题是,由于某种原因,当我使用 $url 的 -uri 调用 invoke-restmethod 时,它似乎令人窒息。事实上,无论我在哪里尝试使用它,它都令人窒息。我相信我可能会错误地尝试这样做。是否有更好或更直接的方法来完成此脚本的参数化。

 #Variables that will probably need to change depeneding on environment
$server = "c3po:140"
$applicationName = "/webiznet_dev"
$applicationPath = "webiz_serviceapi"
$protocol = "http:"

#Variables that probably won't need to change
$userName = "PowerShellUser"
$auth = "token "
$rootUrl = '{0}//{1}{2}' -f $protocol, $server, $applicationName
$userId = 0

#Decrypting PWord 
#Might need to change $PSScriptRoot to where you have the txt file 
$securePassword = Get-Content "$PSScriptRoot\password.txt" | ConvertTo-SecureString
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePassword)
$password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
$login = @{"Username"=$userName; "Password"=$password; }

#Login and Get Token 
$fullApplicationPath = "{0}//{1}/{2}" -f $protocol, $server, $applicationPath
$url = "{0}/job/login" -f $fullApplicationPath
$jsonHeaders = "{'UserId':$userId,'ApplicationName':$applicationName,'RootUrl':$rootUrl,'ApplicationInsightsGUID':'8773f299-9fed-4431-ab34-888888888888','DisableEmail':'true'}";
$HeaderWrap = @{"Authorization"=$auth};
$HeaderWrap.Add("x-webiz-app-info",$jsonHeaders);
$token = Invoke-RestMethod -Uri $url -Method Post -Body $login -Headers $HeaderWrap;


#Write out url which works fine
 Write-Host $url

#Load values for api calls as the token is now populated so the appInfo can get properly populated
$encryptedString = $token.EncryptedString
$userId = $token.UserId
$auth = "token $encryptedString"
$jsonHeaders = "{'UserId':$userId,'ApplicationName':$applicationName,'RootUrl':$rootUrl,'ApplicationInsightsGUID':'8773f299-9fed-4431-ab34-888888888888','DisableEmail':'true'}";
$HeaderWrap = @{"Authorization"=$auth};
$HeaderWrap.Add("x-webiz-app-info",$jsonHeaders);

#Scripts to call scheduled notification jobs in 
$url = '{0}/Job/RunNotificationReminders' -f $fullApplicationPath
Invoke-RestMethod  $url -Method Post -Headers $HeaderWrap
$url = '{0}/Job/RunAddressChanges' -f $fullApplicationPath
Invoke-RestMethod $url -Method Post -Headers $HeaderWrap;
$url = '{0}/Job/RunStorageUnitTemperatureReadingDueAlerts' -f $fullApplicationPath
Invoke-RestMethod $url -Method Post -Headers $HeaderWrap;
$url = '{0}/Job/RunThermometerCalibrationDueAlerts' -f $fullApplicationPath
Invoke-RestMethod $url -Method Post -Headers $HeaderWrap;

收到的错误之一

Invoke-RestMethod:解析注释时出错。预期:*,得到 w。路径“ApplicationName”,第 1 行,位置 31。(错误代码:c2d09f7a-f31a-4db1-a448-8214b6ab65ed) 在 C:\inetpub\wwwroot\WebIZ_Shane\CustomerSQLScripts\Powershell\20150522_Scheduled_Jobs_API_Calls.ps1:25 char:10 + $token = Invoke-RestMethod -Uri $url -Method Post -Body $login -Headers $HeaderW ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

【问题讨论】:

  • 可能 REST 方法执行时间过长,因此您的 Powershell 客户端等待 REST API 返回。
  • @Vesper 我收到的错误听起来更像是不喜欢我放入 uri 的内容
  • 调试脚本并中断。转储$url 参数并查看字符串 actually 是什么。
  • 我不是 PowerShell 专家,但我认为使用插值字符串更为惯用:$fullApplicationPath = "{0}//{1}/{2}" -f $protocol , $server, $applicationPath;变为:$fullApplicationPath = "$protocol//$server/$applicationPath";双引号在这里很重要,单引号字符串不会扩展变量。
  • @Mark 不,字符串应该正确形成。只需在 Powershell 中复制粘贴 OP 的代码,即可正确形成 $url。虽然是的,但这样字符串看起来更漂亮。

标签: powershell


【解决方案1】:

您是否尝试将 JSON 值包装在单个 qoutes 以及键中?

例如 - 在构建 $jsonHeader 时在 $applicationname 和 $rooturl 周围放置单引号?

示例

$jsonHeaders = "{'UserId':$userId,'ApplicationName':'$applicationName','RootUrl':'$rootUrl','ApplicationInsightsGUID':'8773f299-9fed-4431-ab34-888888888888',' DisableEmail':'true'}";

原因

我这样说是因为您的错误表明 Web 服务正在接收“w”而不是 ApplicationName 的另一个预期值。查看原始代码为 JSON 标头生成的值,您可以清楚地看到 /w 是字符串中第一个不带引号的字符(来自 /webiznet_dev),并且很可能会破坏您的网络服务。
{{'UserId':,'ApplicationName':/webiznet_dev,'RootUrl':http://c3po:140/webiznet_dev,'ApplicationInsightsGUID':'8773f299-9fed- 4431-ab34-888888888888','DisableEmail':'true'}, 令牌}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2022-12-15
    • 2014-07-23
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多