Windows API の ShellExecuteExW を使えば恐らく可能だと思います。
引数に指定する SHELLEXECUTEINFOW 構造体にモニターを指定するフィールドがあるので、そう判断しました。
ただし、PowerShell で Windows API を扱うには C# などでラップする必要があり、やや面倒です。
確実性は落ちますが、別案を以下に記載します。
どのような方法かというと、一度ソフトを起動し、起動したウィンドウを指定したスクリーンまで移動させます。
ウィンドウの移動方法として、UI Automationという技術を使用します。
実際のコードは以下になります。FilePath に指定してプログラム(メモ帳)が一つ目のスクリーンで最大化されます。
powershell
1# https://teratail.com/questions/274616
2
3Add-Type -AssemblyName @(
4 # スクリーン取得用。
5 'System.Windows.Forms'
6
7 # 画面操作用のライブラリ。
8 'UIAutomationClient'
9 'UIAutomationTypes'
10)
11
12# 起動したいソフトへのパス。
13[string]$FilePath = 'notepad.exe'
14
15# 表示したいスクリーンを指定。
16[System.Windows.Forms.Screen]$DisplayScreen = [System.Windows.Forms.Screen]::AllScreens[0]
17
18# $FilePath を起動して、Process オブジェクトを取得。
19[System.Diagnostics.Process]$proc = Start-Process -FilePath $FilePath -PassThru
20
21# ウィンドウが生成されるまで待機(ここはソフトによって修正が必要な可能性あり)
22while ($proc.MainWindowHandle -eq [System.IntPtr]::Zero) {
23 Start-Sleep -Milliseconds 1
24}
25Start-Sleep -Milliseconds 1
26
27if ($proc.WaitForInputIdle()) {
28 # UI Automation を使って、ウィンドウハンドルから対象の UI 要素を取得。
29 [System.Windows.Automation.AutomationElement]$uiaProcMain =
30 [System.Windows.Automation.AutomationElement]::FromHandle($proc.MainWindowHandle)
31
32 # TransformPattern(移動及びサイズ変更が可能な一面) を取得。
33 [System.Windows.Automation.TransformPattern]$trans =
34 $uiaProcMain.GetCurrentPattern([System.Windows.Automation.TransformPattern]::Pattern)
35
36 # ウィンドウを表示したいスクリーンまで移動(本当は単位系が違うので、DPIの設定やPowerShell実行ホストによって上手く行かない可能性あり)
37 $trans.Move(
38 [double]($DisplayScreen.WorkingArea.Left),
39 [double]($DisplayScreen.WorkingArea.Top)
40 )
41
42 # WindowPattern(ウィンドウとしての操作が可能な一面) を取得。
43 [System.Windows.Automation.WindowPattern]$win =
44 $uiaProcMain.GetCurrentPattern([System.Windows.Automation.WindowPattern]::Pattern)
45
46 # 画面を最大化。
47 $win.SetWindowVisualState(
48 [System.Windows.Automation.WindowVisualState]::Maximized
49 )
50}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。