web-dev-qa-db-ja.com

複数のPowerShellスクリプトを連続して実行する-フォルダー上で-スクリプトをマスタースクリプトに結合する

6つ以上のスクリプトがあり、フォルダーで実行するように成長しています。これらを次々に実行する最良の方法は何ですか。

私はこのスレッドを見て試しました-残念ながら動作しませんでした。

powershellスクリプトで複数のスクリプトを1つずつ実行する方法

マスター.psファイルに-順番に実行する必要があるパワーシェルスクリプトへのリンクを配置しました

スクリプトを順番に実行する

'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を実行しました。これで、これまでの作業は完了です。

15
wp44

パスをハードコーディングしたくない場合は、次のようにMaster.ps1を作成できます。

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

そして、それは同じディレクトリでそれらのスクリプトを探します。

14
mjolinor

コードエディターまたはテキストエディターを使用してテキストファイルを作成し、次のバッチスクリプトの例を使用します。

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

script.batとして保存し、開きます。これにより、2つの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 }
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"
 );
1
InvalidFileName

マスターファイル内のファイルへのパスをハードコーディングしていますか?

この場合、このようなものが機能するはずです

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"
1
thecaptain0220

複数のスクリプトを連続して実行するには、-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は、現在のスクリプトが完了するのを待ってから、次のスクリプトを実行します

0
Bluecakes