У меня есть 2 скрипта powershell
script1.ps1
содержит вызовы REST к Vault, которые возвращают ответ json, содержащий некоторые ключи/значения.
Function getValues($token) {
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("X-Vault-Token", $token)
$response = Invoke-RestMethod -method GET -uri "https://vault.com:8243/v1/secret/vault/development" -ContentType 'application/json' -headers $headers
$response.data| ConvertTo-Json -depth 100
}
getValues $token
предположим, что один из этих ключей в ответе выглядит следующим образом:
key1:value123
script2.ps1
звонит scrip1.ps1
вот так
$currentDirectory = "D:\\Scripts"
$response = & "$currentDirectory\script1.ps1" | ConvertFrom-Json
$pass = $response[1]."key1"
$pass
этот блок выполняется просто отлично, если я тестирую локально и получаю value123
результат, как и ожидалось
теперь я настроил удаленную задачу powershell WinRM на TFS как часть сборки, которая вызывает script2.ps1
.
конечно, я записываю почти все в файл журнала в моем script2
, чтобы я мог видеть все, что происходит на выходе, кроме ответа. ответ не возвращается вообще!
$pass ничего не печатает, когда я запускаю сборку TFS, но локально печатает нормально
есть ли что-то особенное, что я должен обернуть этой командой специально для TFS? я что-то пропустил здесь??
@lloyd нет, не работает. чего я не понимаю, так это того, что я даже не пытаюсь распечатать это на консоли TFS, а просто получаю значение, хранящееся в переменной, и использую его где-то еще. он ничего не хранит
что содержит ответ?
@lloyd ключ1:значение123 . Затем $pass должен содержать значение123. он отлично работает локально, но сборка из TFS, нет
вы возвращаете его как массив ,$stuff
в сценарии 1? как вы мешаете ps возвращать журналы в сценарии 1?
@lloyd нет. проверьте мой пост, я обновил то, что у меня есть в script1
Invoke-RestMethod -Uri https://blogs.msdn.microsoft.com/powershell/feed/
возвращает массив, поэтому мне не нужно преобразовывать его туда и обратно из этой точки, если только вы не хотите передать его в виде строки. return ,$response
не должен требовать convertto-json и convertfrom-json?
@lloyd Я следил за ответом здесь, который с тех пор отлично работает локально: stackoverflow.com/a/56119686/8397835?
@Cataster, где существуют оба скрипта? на целевой машине или на машине агента?
@Shayki Abramczyk, сценарии находятся на целевой машине, поэтому я выбрал удаленное управление PowerShell (WinRM)
@Cataster Хорошо, вы пробовали запускать сценарии на машине агента (с помощью обычного тасла powershell), чтобы проверить, работает ли он?
@ShaykiAbramczyk я понял это! поэтому я использовал переменную среды для набора токенов в переменных USER env. По-видимому, это должно быть сохранено в системных переменных env.
@lloyd наконец-то понял!! см. ответ
Здорово! Хорошо поймал!
Я наконец-то разобрался с проблемой
У нас был токен, сохраненный в переменных окружения USER, из которого скрипт не смог вызвать. Я думаю, что когда я тестировал, потому что я вошел на сервер как указанный пользователь, сценарий работал, потому что он распознал пользователя и смог получить переменную среды.
Однако, когда я запускаю TFS с помощью удаленного Powershell, он не распознает пользовательскую переменную env.
Установка токена переменной env в системных переменных env сработала!
запись-вывод может быть?