У меня есть следующий сценарий, работающий на Powershell v5:
Сценарий Powershell извлекает несколько битов информации из вызова API в стороннюю систему в массе для каждого l oop и назначает их Переменные. Среди извлекаемой информации - пароли (это делается для того, чтобы избавиться от упомянутой сторонней системы и перенести ее на что-то, что не позволяет вам получать пароли в виде простого текста):
$userset = Invoke-WebRequest -Method Post -Uri "https://$Url/path/to/api.asmx" -Headers $Headers -Body $usercall
$xmluserset = [xml] $userset.Content
$userset2 = $xmluserset.Envelope.Body.UserSettingsResult.settingValues.string
$userpasstemp = $userset2[1].trimstart("password")
$userpass = $userpasstemp.trimstart("=")
Эти пароли затем используются в других местах скрипта.
Например, они передаются другому API и должны быть в формате, совместимом с URL, поэтому я запускаю это:
$urlescapeduserpass = [uri]::EscapeDataString($userpass)
который работает для этого раздела скрипта
Проблема заключается в том, что эти пароли могут содержать любые специальные символы:! "# $% & '() * +, -. / :; <=>? @ [] ^ _ `{|} ~
И когда я вызываю другую часть сценария, специальные символы в строке пароля вызывают сбой и сценарий завершается. Это происходит при использовании любой из команд вызова:
& .\application.exe --option1 $option1 --user1 $user --password1 $userpass
или при использовании выражения invoke
$command = "$path\application.exe --option1 $option1 --user1 $user --password1 $userpass"
Invoke-Expression $command
Я пытался использовать Regex, используя командлет -replace:
$escapedpass = $userpass -replace ' !"#$%&()*+,-./:;<=>?@[\]^_`{|}~', '`$&'
Но не повезло, Я знаю что-то похожее на [uri] escapedatastring, есть подобное для Regex, но, кажется, нет единственного родного для Powershell. Я уверен, что есть либо [contenttype], у которого будет встроенная функция для экранирования специальных символов, либо какой-то способ достижения конечного результата.