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