Давайте поговорим о том, что не так.
$commandFragments += " -Body $postParams"
Вы превращаете HashTable в строку.Что не возможно.Итак, что мы можем сделать, это преобразовать это во что-то.Теперь что мы должны преобразовать в?Invoke-WebRequest -body
Это можно сделать с помощью Json.Таким образом, вы можете использовать " -Body $($postParams | convertto-json)"
Но это только сохранение JSON в строку, которая все еще не будет работать, поскольку Json должен находиться в строке внутри команды Invoke-WebRequest
.Поэтому исправление будет заключаться в том, чтобы заключить JSON в одинарные кавычки." -Body '$($postParams | ConvertTo-Json)'"
У нас также есть несколько небольших исправлений, которые мы можем сделать для повышения эффективности.Например, операторы if выглядят как
$PSBoundParameters.GetEnumerator() | %{
switch($_.Key){
"uri" { $commandFragments += " -Uri $uri" }
"method" { $commandFragments += " -Method $method" }
"postParams" { $commandFragments += " -Body '$($postParams | ConvertTo-Json)'" }
}
}
Конечный продукт:
$uri = 'https://exdom.com/login.jsp?saml_sso=false'
$method = "POST"
$postParams = @{
"os_username" = "username";
"os_password" = "password";
"login" = "true"
}
$scriptBlock = {
param(
[Parameter(Mandatory=$true,Position=1)][string]$uri,
[Parameter(Mandatory=$false,Position=2)][string]$method,
[Parameter(Mandatory=$true,Position=3)][hashtable]$postParams
)
$commandFragments = $("Invoke-WebRequest")
$PSBoundParameters.GetEnumerator() | %{
switch($_.Key){
"uri" { $commandFragments += " -Uri $uri" }
"method" { $commandFragments += " -Method $method" }
"postParams" { $commandFragments += " -Body '$($postParams | ConvertTo-Json)'" }
}
}
(Invoke-Expression -Command $($commandFragments -join '')).Content | Out-File 'c:\tmp\response3.html'
(Invoke-Expression -Command "Invoke-WebRequest -Uri https://exdom.com/login.jsp?saml_sso=false -Method POST -Body @(@{'os_username' = 'username@mydomain.com'; 'os_password' = 'mypassword'; 'login' = 'true'})").Content | Out-File 'c:\tmp\response4.html'
(Invoke-WebRequest -Method $method -Uri $uri -Body $postParams|ConvertTo-Json).Content
}
Invoke-Command -ScriptBlock $scriptBlock -ArgumentList ($uri, $method, $postParams)