Запустите несколько Powershell Script s последовательно - в папке - объедините Script s в мастер Script

У меня есть 6+ скриптов и растет для запуска в папке, что лучший способ заставить их запускать один за другим.

Я видел и пробовал эту тему - это не сработало.

Как запускать несколько скриптов один за другим в powershell script

В основном файле .ps - я поместил ссылки на сценарии командной оболочки, которые нужно запускать в порядке

Запустить скрипты в порядке

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

и т.д.

Это тоже не сработало. Ваша помощь приветствуется - я искал все и не могу решить эту проблему.

Пересмотренный: Я верю, что мне придется дождаться завершения каждой оболочки питания script до запуска следующего - поскольку у меня были ошибки, когда я пытался запускать 3 сценария один за другим - ничего не происходило, когда скрипты выполнялись

Финал -

Я благодарю всех вас за вашу помощь - чтобы все было просто, это то, что я сделал.

В моей папке есть сценарии ниже - я тогда создал Master.ps1 с кодом ниже внутри него:

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

Затем я запустил Master.ps1 в папке со всеми файлами - и он выполняет эту работу до сих пор.

Ответ 1

Если вы не хотите жестко кодировать путь, вы можете сделать Master.ps1 следующим:

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

И он будет искать эти сценарии в том же каталоге, где он есть.

Ответ 2

Просто создайте текстовый файл, используя любой редактор кода или текстовый редактор, и используйте следующий пример: пакет script:

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

Сохраните его как script.bat и откройте его. Это приведет к одновременному запуску двух сценариев powershell.

Ответ 3

Чтобы получить путь, в котором находится ваш script, вы можете сделать это:

$MyInvocation.MyCommand.Definition

Это покажет что-то вроде "C:\Users\WP\Desktop\Scripts\Master.ps1". Из этого мы можем сделать Split-Path, чтобы получить только папку, и запустите Get-ChildItem в папке, чтобы получить список файлов. Вероятно, мы захотим исключить мастер script, чтобы мы не попали в рекурсивный цикл, чтобы выглядеть примерно так:

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

Затем мы просто запускаем их через цикл ForEach-Object и вызываем script с помощью оператора вызова & как такового:

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

Изменить: Hm, это не было правильной фильтрацией. Здесь выполняется повторная запись, которая корректно отфильтровывает мастер script.

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

Ответ 4

Причина, по которой всплывает экран powershell, заключается в том, что у вас нет аргумента -NoExit set. В качестве примера воспользуйтесь приведенным ниже примером, чтобы убедиться, что ваш код работает правильно:

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

Извините за поздний ответ, но я также столкнулся с проблемой, и вот как я смог ее решить, чтобы убедиться, что это была работа.

Также я меняю имена файлов следующим образом:

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

Ответ 5

Вы жестко кодируете пути к файлам в основном файле?

В этом случае что-то вроде этого должно работать

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"

Ответ 6

Чтобы запустить несколько сценариев последовательно, вы можете использовать параметр -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 будет ждать завершения текущего script перед запуском следующего script