2011-06-01 41 views
-1

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

我计算过,我会的框架随时调用一个名为“设置”中的所有PowerShell脚本的特定目录(或类似的东西)的功能。如果没有“设置”功能,那就没问题了,它不应该出错。然后我将运行该部署,然后在Powershell脚本中运行其他功能。

鉴于目录列表,我如何循环访问每个Powershell脚本并运行这些功能?

感谢您的任何指导!

回答

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" 
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

+0

感谢。我知道有一个语法可以通过一个包含括号的变量名来调用,但我无法在任何地方找到它。我会尝试一些我自己的测试,并在这里发布结果。另外,我的目标是在所有脚本中运行Setup函数,但后来我想用“-setup”开关参数来代替......当然,这需要能够传递参数:) – 2011-06-02 13:59:28

+0

我测试了你的第一个脚本它只是返回字符串变量的值(脚本的完整路径)。 Invoke-Command有一些问题(似乎有一个需要使用“-ComputerName”参数的错误,但即使在本地计算机上,它也是一个远程调用。我将发布解决方案。我给你加票。如果你想要我改变选定的答案,那么你可以改变你的,我会改变它。谢谢您的帮助! – 2011-06-02 15:12:35

+0

@ Tom-H。感谢您的投票 - 现在对我来说有点迟了。我刚刚意识到Invoke-command在本地调用filepath参数时使用WinRM - 这对我来说是新的!很高兴有帮助。 – Matt 2011-06-02 22:05:42