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

问题描述 投票:15回答:6

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

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

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

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

Run Scripts in order

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

等等

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

修改:我相信我必须等待每个power shell脚本在运行下一个之前完成 - 因为当我尝试一个接一个地运行3个脚本时我遇到了错误 - 脚本运行时没有任何反应

最后 -

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

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

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

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

powershell scripting
6个回答
13
投票

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

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

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


3
投票

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

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

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


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 }

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

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"

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将在运行下一个脚本之前等待当前脚本完成

© www.soinside.com 2019 - 2024. All rights reserved.