#powershell #function-calls
#powershell #вызовы функций
Вопрос:
Я создаю платформу тестирования для моей текущей команды разработчиков. Единственное, что я хотел бы позволить им сделать, это создать сценарий Powershell для запуска своих тестов. Система представляет собой систему развертывания базы данных, поэтому для ее тестирования им потенциально потребуется запустить некоторый код настройки, затем развертывание будет запущено, затем они выполнят некоторый проверочный код в конце.
Поскольку развертывание занимает некоторое время, я хотел бы, чтобы платформа обрабатывала это один раз для всех тестов. Итак, основной поток:
Run test #1 set-up
Run test #2 set-up
Run test #3 set-up
Run the deploy process
Run the code to confirm that test #1 passed
Run the code to confirm that test #2 passed
Run the code to confirm that test #3 passed
Я подумал, что я хотел бы, чтобы платформа всегда вызывала функцию с именем «setup» (или что-то подобное) во всех сценариях Powershell в определенном каталоге. Если функция «setup» не существует, все в порядке, и она не должна выдавать ошибку. Затем я бы запустил развертывание, а затем запустил другие функции в сценариях Powershell.
Учитывая список каталогов, как я мог бы циклически просматривать каждый сценарий Powershell и запускать эти функции?
Спасибо за любые рекомендации!
Ответ №1:
это приведет к повторному просмотру указанной папки и выполнению всех найденных сценариев setup.ps1.
Get-ChildItem D:test -Recurse | where { $_.name -eq "setup.ps1" }| foreach {
"Executing $($_.Fullname)"
Invoke-Expression "$($_.Fullname) -setup -Verbose"
}
Однако он не принимает параметры….
Если вы просто хотели углубиться в одну папку, это сделает работу:
Get-ChildItem D:test | where{$_.psiscontainer}|foreach {
Get-ChildItem $_.fullname | where { $_.name -eq "setup.ps1" }| foreach {
"Executing $($_.Fullname)"
Invoke-Expression "$($_.Fullname) -setup -Verbose"
}
}
Меня немного раздражает, что параметры не сработали — интересно, может ли для этого сработать использование Invoke-Command. У меня нет времени пробовать сейчас, если кто-нибудь еще не разберется в этом, я посмотрю позже.
Вот сценарий, который я использовал для установки.ps1
[cmdletbinding()]
Param()
function setup() {
Write-Verbose "In setup 1"
Write-Output "Done setup 1"
}
setup
HTH
Комментарии:
1. Спасибо. Я знал, что существует синтаксис для вызова с помощью имени переменной, которое включает круглые скобки, но я нигде не мог его найти. Я также попробую некоторые из своих собственных тестов и опубликую здесь результаты. Кроме того, моей целью было запустить функцию настройки внутри всех сценариев, но затем я подумал об использовании вместо параметра переключателя «-setup» … конечно, для этого требуется возможность передачи параметров 🙂
2. Я протестировал ваш первый скрипт, и он просто вернул значение строковой переменной (полный путь скрипта). У Invoke-Command возникли некоторые проблемы (похоже, есть ошибка, из-за которой требуется использовать параметр «-ComputerName», но тогда это удаленный вызов, даже если он выполняется на локальном компьютере. Однако Invoke-Expression сработал. Я собираюсь опубликовать решение. Я отдал вам голос «за». Если вы хотите, чтобы я изменил выбранный ответ, то вы можете изменить свой, и я поменяю его. Спасибо за помощь!
3. @Tom-H. Спасибо за голосование «за» — на данный момент для меня немного поздновато. Я только что понял, что Invoke-command использует WinRM при локальном вызове с параметром filepath — это было ново для меня! Рад, что помогли.
4. @Tom-H Я добавил выражение вызова, подобное приведенному ниже. Я не на 100% доволен этим, поскольку он не обрабатывает пробелы в пути….
Ответ №2:
Благодаря идеям Мэтта, с которыми я смог столкнуться Invoke-Expression
. В идеале я хотел бы использовать Invoke-Command
с -filepath
параметром, который предположительно по умолчанию выполняется локально. Однако существует ошибка, из-за которой требуется использовать -ComputerName
параметр даже при локальном запуске. Если вы используете этот параметр, то для этого требуется включить удаленную связь, даже при запуске на локальном компьютере.
Вот код, который я использовал в своем скрипте:
# Run the setup functions from all of the Powershell test scripts
foreach ($testPSScript in Get-ChildItem "$testScriptDir*.ps1") {
Invoke-Expression "$testPSScript -Setup"
}
# Do some other stuff
# Run the tests in the Powershell test scripts
foreach ($testPSScript in Get-ChildItem "$testScriptDir*.ps1") {
Invoke-Expression "$testPSScript"
}
Тогда мой тестовый скрипт выглядел следующим образом:
param([switch]$Setup = $false)
if ($Setup) {write-host "Setting things up"; return}
Write-Host "Running the tests"