在多个Powershell脚本中运行set函数名称

时间:2011-06-01 19:28:21

标签: powershell function-calls

我正在为当前的开发团队构建测试框架。我想让他们做的一件事是创建一个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

我认为我会让框架总是在特定目录的所有Powershell脚本中调用一个名为“setup”(或类似的东西)的函数。如果没有“设置”功能,那就没问题就不会出错。然后我将运行部署,然后在Powershell脚本中运行其他功能。

鉴于目录列表,我如何循环遍历每个Powershell脚本并运行这些函数?

感谢任何指导!

2 个答案:

答案 0 :(得分: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是否适用于此。我现在还没来得及尝试,除非其他人都知道,我稍后会看看。

这是我用于setup.ps1的脚本

[cmdletbinding()]
Param()

function setup() {

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

}

setup

HTH

答案 1 :(得分:0)

感谢Matt的想法,我能够遇到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"