Ответ 1
Если вы не хотите жестко кодировать путь, вы можете сделать Master.ps1 следующим:
&"$PSScriptroot\1.ps1"
&"$PSScriptroot\2.ps1"
&"$PSScriptroot\3.ps1"
И он будет искать эти сценарии в том же каталоге, где он есть.
У меня есть 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 в папке со всеми файлами - и он выполняет эту работу до сих пор.
Если вы не хотите жестко кодировать путь, вы можете сделать Master.ps1 следующим:
&"$PSScriptroot\1.ps1"
&"$PSScriptroot\2.ps1"
&"$PSScriptroot\3.ps1"
И он будет искать эти сценарии в том же каталоге, где он есть.
Просто создайте текстовый файл, используя любой редактор кода или текстовый редактор, и используйте следующий пример: пакет script:
start /min powershell.exe C:\your folder\script1.ps1
start /min powershell.exe C:\your folder\script2.ps1
Сохраните его как script.bat
и откройте его. Это приведет к одновременному запуску двух сценариев powershell.
Чтобы получить путь, в котором находится ваш 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 }
Причина, по которой всплывает экран 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"
);
Вы жестко кодируете пути к файлам в основном файле?
В этом случае что-то вроде этого должно работать
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 будет ждать завершения текущего script перед запуском следующего script