按顺序运行多个Powershell脚本 - 在文件夹上 - 将脚本合并到主脚本中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按顺序运行多个Powershell脚本 - 在文件夹上 - 将脚本合并到主脚本中相关的知识,希望对你有一定的参考价值。
我有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 - 它到目前为止完成了这项工作。
如果您不想对路径进行硬编码,可以像下面这样制作Master.ps1:
&"$PSScriptroot\1.ps1"
&"$PSScriptroot\2.ps1"
&"$PSScriptroot\3.ps1"
它将在同一目录中查找这些脚本。
只需使用任何代码编辑器或文本编辑器创建文本文件,然后使用以下示例批处理脚本:
start /min powershell.exe C:\your folder\script1.ps1
start /min powershell.exe C:\your folder\script2.ps1
将它保存为script.bat
并打开它。这将使两个PowerShell脚本同时运行。
要获取脚本所在的路径,可以执行以下操作:
$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 }
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"
);
您是否正在编写主文件中文件的路径?
在这种情况下,这样的事情应该工作
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"
要按顺序运行多个脚本,可以在-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将在运行下一个脚本之前等待当前脚本完成
以上是关于按顺序运行多个Powershell脚本 - 在文件夹上 - 将脚本合并到主脚本中的主要内容,如果未能解决你的问题,请参考以下文章
Powershell 无法将“mysql”项识别为 cmdlet函数脚本文件或可运行程序的名称