Запуск заданного имени функции в нескольких скриптах Powershell - PullRequest
0 голосов
/ 01 июня 2011

Я создаю среду тестирования для моей текущей команды разработчиков. Одна вещь, которую я хотел бы позволить им сделать, это создать скрипт 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 в определенном каталоге. Если никакой «установочной» функции не существует, это нормально, и она не должна выдавать ошибку. Затем я запускаю развертывание, а затем запускаю другие функции в сценариях Powershell.

Учитывая список каталогов, как я мог бы пройтись по каждому сценарию Powershell и запустить эти функции?

Спасибо за любые советы!

Ответы [ 2 ]

1 голос
/ 02 июня 2011

это будет проходить через заданную папку и выполнять все найденные сценарии 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 сработать для этого.У меня нет времени, чтобы попробовать сейчас, если кто-нибудь еще не поймет, я посмотрю позже.

Вот скрипт, который я использовал для setup.ps1

[cmdletbinding()]
Param()

function setup() {

    Write-Verbose "In setup 1"
    Write-Output "Done setup 1"

}

setup

HTH

0 голосов
/ 02 июня 2011

Благодаря идеям Мэтта мне удалось встретить 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"
...