按顺序运行多个Powershell脚本 - 在文件夹上 - 将脚本合并到主脚本中

时间:2016-03-09 21:31:25

标签: powershell scripting

我有6个以上的脚本并且正在逐渐运行在一个文件夹上,让它们一个接一个地运行的最佳方法是什么。

我已经看过并试过这个帖子 - 不幸的是它没有用。

How to run multiple Scripts one by one in a powershell script

在主.ps文件中 - 我已将链接添加到需要按顺序运行的power shell脚本

按顺序运行脚本

'C:\Users\WP\Desktop\Scripts\1.ps1'
'C:\Users\WP\Desktop\Scripts\2.ps1'
'C:\Users\WP\Desktop\Scripts\3.ps1'

这也不起作用。感谢您的帮助 - 我已经搜索了所有内容,似乎无法解决此问题。

修改:我相信在运行下一个之前我必须等待每个电源shell脚本完成 - 因为当我试图一个接一个地运行3个脚本时我遇到了错误 - 没有在脚本运行时发生了

最终 -

我感谢大家的帮助 - 保持简单,这就是我所做的

我的文件夹中有以下脚本 - 然后我创建了一个Master.ps1,其中包含以下代码:

&"$PSScriptroot\1.ps1"
&"$PSScriptroot\2.ps1"
&"$PSScriptroot\3.ps1"
&"$PSScriptroot\4.ps1"
&"$PSScriptroot\5.ps1"
&"$PSScriptroot\6.ps1"

然后我在包含所有文件的文件夹上运行Master.ps1 - 它到目前为止完成了这项工作。

6 个答案:

答案 0 :(得分:13)

如果您不想对路径进行硬编码,可以像这样制作Master.ps1:

&"$PSScriptroot\1.ps1"
&"$PSScriptroot\2.ps1"
&"$PSScriptroot\3.ps1"

它将在同一目录中查找这些脚本。

答案 1 :(得分:3)

只需使用任何代码编辑器或文本编辑器创建文本文件,然后使用以下示例批处理脚本:

start /min powershell.exe C:\your folder\script1.ps1
start /min powershell.exe C:\your folder\script2.ps1

将其另存为script.bat并将其打开。这将使两个PowerShell脚本同时运行。

答案 2 :(得分:1)

要获取脚本所在的路径,可以执行以下操作:

$MyInvocation.MyCommand.Definition

这将显示类似于' C:\ Users \ WP \ Desktop \ Scripts \ Master.ps1'。从那里我们可以Split-Path来获取文件夹,并在文件夹上运行Get-ChildItem以获取文件列表。我们可能想要排除主脚本,这样我们就不会在递归循环中结束,所以看起来像这样:

$ScriptPath = Split-Path $MyInvocation.MyCommand.Definition
Get-ChildItem "$ScriptPath\*.ps1" | Where{$_.FullName -ne $MyInvocation.MyCommand.Definition}

然后我们通过ForEach-Object循环运行它们,并使用调用操作符&调用脚本:

$ScriptPath = Split-Path $MyInvocation.MyCommand.Definition
Get-ChildItem "$ScriptPath\*.ps1" | Where{$_.FullName -ne $MyInvocation.MyCommand.Definition} | ForEach-Object { & $_.FullName }

编辑:嗯,这不是正确的过滤。这是一个重写,可以正确过滤掉主脚本。

$Master = Split-Path $MyInvocation.MyCommand.Definition -Leaf
$ScriptPath = Split-Path $MyInvocation.MyCommand.Definition
Get-ChildItem "$ScriptPath\*.ps1" | Where{$_.Name -ne $Master} | ForEach-Object { & $_.FullName }

答案 3 :(得分:1)

PowerShell屏幕弹出的原因是因为你没有设置参数-NoExit。请使用以下示例来查看您的代码是否正常运行:

Start-Process "$pshome\powershell.exe" -ArgumentList "-NoExit", "-Command '& script'" -wait

对于迟到的回复感到抱歉,但我也遇到了问题,这就是我如何解决它以确保它能够正常工作。

我也按如下方式更改文件名:

$Scripts =
@(
 ".\C:\Scripts\First.ps1"
 ".\C:\Scripts\Second.ps1"
 ".\C:\Scripts\Third.ps1"
 );

答案 4 :(得分:0)

您是否正在编写主文件中文件的路径?

在这种情况下,这样的事情应该起作用

Invoke-Expression "C:\Users\WP\Desktop\Scripts\1.ps1"
Invoke-Expression "C:\Users\WP\Desktop\Scripts\2.ps1"
Invoke-Expression "C:\Users\WP\Desktop\Scripts\3.ps1"

答案 5 :(得分:0)

要按顺序运行多个脚本,您可以使用-Wait上的Start-Process参数,如下所示:

$scriptsList = 
@(
    'C:\Users\WP\Desktop\Scripts\1.ps1'
    'C:\Users\WP\Desktop\Scripts\2.ps1'
    'C:\Users\WP\Desktop\Scripts\3.ps1'
)

foreach($script in $scriptsList)
{
    Start-Process -FilePath "$PSHOME\powershell.exe" -ArgumentList "-command '& $script'" -Wait
}

PowerShell将在运行下一个脚本

之前等待当前脚本完成