【发布时间】: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