-1

我正在为我当前的开发团队构建一个测试框架。我想让他们做的一件事是创建一个 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 脚本并运行这些函数?

感谢您的任何指导!

4

2 回答 2

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

高温高压

于 2011-06-02T06:49:55.553 回答
0

感谢马特的想法,我能够遇到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"
于 2011-06-02T15:16:54.620 回答