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を実行しました。これで、これまでの作業は完了です。
パスをハードコーディングしたくない場合は、次のようにMaster.ps1を作成できます。
&"$PSScriptroot\1.ps1"
&"$PSScriptroot\2.ps1"
&"$PSScriptroot\3.ps1"
そして、それは同じディレクトリでそれらのスクリプトを探します。
コードエディターまたはテキストエディターを使用してテキストファイルを作成し、次のバッチスクリプトの例を使用します。
start /min powershell.exe C:\your folder\script1.ps1
start /min powershell.exe C:\your folder\script2.ps1
script.bat
として保存し、開きます。これにより、2つのPowerShellスクリプトが同時に実行されます。
スクリプトが含まれているパスを取得するには、これを行うことができます:
$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 }
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"
);
マスターファイル内のファイルへのパスをハードコーディングしていますか?
この場合、このようなものが機能するはずです
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は、現在のスクリプトが完了するのを待ってから、次のスクリプトを実行します