我有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 - 它到目前为止完成了这项工作。
答案 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将在运行下一个脚本
之前等待当前脚本完成