【问题标题】:Run Multiple Powershell Scripts Sequentially - on a Folder - Combine Scripts into a Master Script按顺序运行多个 Powershell 脚本 - 在文件夹上 - 将脚本组合成主脚本
【发布时间】:2017-12-25 10:24:59
【问题描述】:

我有 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'

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

修订:我相信我必须等待每个 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 - 到目前为止它已经完成了这项工作。

【问题讨论】:

  • 当您说one after the other 时,您是要等待每个脚本完成后再运行下一个,还是同时运行它们?
  • 嗨,我应该等待每个人完成 - 这是有道理的。依次运行脚本 1 - 然后 2 和 3 :)

标签: powershell scripting


【解决方案1】:

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

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

它会在它所在的同一目录中查找这些脚本。

【讨论】:

  • $PSScriptroot 一直都在吗?我一直在用Split-Path $MyInvocation.MyCommand.Definition 解析脚本根目录,似乎永远都是这样。
  • 嗨 Mj - 我做了这个 &"C:\Users\WP\Desktop\Mjolinor\1.ps1" &"C:\Users\WP\Desktop\Mjolinor\2.ps1" - 它工作:) - 有没有机会 - 它可以等待完成 - 在下一个脚本运行之前 - 以防万一 - 我可能有一个很长的脚本,以防止文本文件中出现意大利面条 - 谢谢
  • 默认情况下它们将按顺序运行。您必须使用作业或运行空间才能使其成为多线程。
  • @TheMadTechnician - $PSScriptRoot 似乎出现在 V3 中。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    要获取脚本所在的路径,您可以这样做:

    $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 }
    

    【讨论】:

    • TMD,谢谢 - 在文件夹中我放了 2 个脚本和调用这些脚本的主脚本......发生了一些事情......但之后它进入了一个循环。在主人我把这个: $MyInvocation.MyCommand.Definition $ScriptPath = Split-Path $MyInvocation.MyCommand.Definition Get-ChildItem "$ScriptPath\*.ps1" |其中{$_.FullName -ne $MyInvocation.MyCommand.Definition} | ForEach-Object { & $_.FullName } - 我不确定我做对了吗?
    • 抱歉,我的第一个版本没有过滤掉主脚本,所以它作为脚本的一部分运行,这只是造成了一个无限循环。我更新了我的答案。
    • 谢谢,我会将它添加到我的 power shell 工具 - 框中 - :)
    【解决方案4】:

    您是否对主文件中文件的路径进行硬编码?

    在这种情况下,这样的事情应该可以工作

    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"
    

    【讨论】:

    • 我不想硬编码 - 但作为一个 powershell 菜鸟 - 我不知道。如果我将 master.ps 与所有其他脚本一起放在文件夹中 - 我将如何从 master 调用它们?谢谢队长
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      要按顺序运行多个脚本,您可以像这样在Start-Process 上使用-Wait 参数:

      $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 将等待当前脚本完成,然后再运行下一个脚本

      【讨论】:

      • 嗨,BC - 我运行了这个,电源外壳屏幕出现了 - 但文本文件中没有发生任何变化 - 我不知道为什么 :(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多