在多个Powershell脚本中运行设置的函数名
问题描述:
我正在为当前的开发团队构建一个测试框架。我想让他们做的一件事是创建一个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脚本并运行这些功能?
感谢您的任何指导!
答
感谢马特的想法我能遇到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"
答
这将递归通过给定的文件夹并执行它找到的所有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
感谢。我知道有一个语法可以通过一个包含括号的变量名来调用,但我无法在任何地方找到它。我会尝试一些我自己的测试,并在这里发布结果。另外,我的目标是在所有脚本中运行Setup函数,但后来我想用“-setup”开关参数来代替......当然,这需要能够传递参数:) – 2011-06-02 13:59:28
我测试了你的第一个脚本它只是返回字符串变量的值(脚本的完整路径)。 Invoke-Command有一些问题(似乎有一个需要使用“-ComputerName”参数的错误,但即使在本地计算机上,它也是一个远程调用。我将发布解决方案。我给你加票。如果你想要我改变选定的答案,那么你可以改变你的,我会改变它。谢谢您的帮助! – 2011-06-02 15:12:35
@ Tom-H。感谢您的投票 - 现在对我来说有点迟了。我刚刚意识到Invoke-command在本地调用filepath参数时使用WinRM - 这对我来说是新的!很高兴有帮助。 – Matt 2011-06-02 22:05:42