59041


WindowsでGNU Screenの特にデタッチ操作を行いたいです。  
良いテクニックやツールなどはご存知ありませんか？  
希望としては極力標準機能のみで行いたいのですがMustではありません。

-追記-  
プロセスはバックグランドで残したままウィンドウを閉じたいです。  
cmd.exeを想定していますが、必要とあらばPowershellやVBScriptなど標準ツールを駆使して実現出来ればと思います。


CC BY-SA 4.0
2019-09-12T08:16:25.033
59018
2019-10-11T09:01:33.597
2019-09-13T08:54:38.070
4236
29342
question
windows powershell batch-file cmd
WindowsでGNU Screenのような操作がしたい


UNIX系OSとWindowsとではプロセスの管理方法が異なります。Windowsではサインインすると[Window
StationとDesktop](https://docs.microsoft.com/en-
us/windows/win32/winstation/about-window-stations-and-
desktops)が作成され、各プロセスはWindow
Stationに属します。ユーザー切り替えやリモートデスクトップで複数ユーザーが操作しても影響を受けないのは、このWindow
Station単位で管理されているためです。

そのため、GNU Screenのようにいわゆるセッションを切り離してプロセスを継続実行させようとしても、サインアウト時にはWindow
Stationに属するプロセスは全て停止させられてしまいます。サービスプロセスのように異なるWindow
Stationでプロセスを起動することもできますが、あまり想定されていない操作になるため、各プログラムが意図しない結果を返す可能性があります。

逆にサインアウトしない前提であれば、ウィンドウを閉じる意味はあまりなく、ウィンドウを最小化すれば済む話となってしまいます。

あまり答えになっていませんが、原理上、実現困難かなと思います。

* * *

なお、PowerShellの場合、[Job](https://docs.microsoft.com/en-
us/powershell/module/microsoft.powershell.core/about/about_jobs?view=powershell-5.1)という機能があり、リモートやバックグラウンドで実行することができます。この中でも[Scheduled
Job](https://docs.microsoft.com/en-
us/powershell/module/psscheduledjob/about/about_scheduled_jobs?view=powershell-5.1)を使うとタスクスケジューラー上で実行させることができるため、サインアウトしても影響を受けることなく実行を継続できます。（もちろん実行結果はJobとして受け取れます。）


CC BY-SA 4.0
2019-09-13T08:53:53.360
59041
2019-09-13T08:53:53.360
4236
59018
answer


GNU Screenではなく bash ですが、同様の機能につき PowerShell
で実現可能か4年前に質問がありますが、昨年くらいまでは出来ていないようです。  
特に要望がコメントにあるように **「ジョブを中断することなく、現在実行中のジョブをバックグラウンドに送信したい」** のであれば。

[How do I send an already running process to the background in power
shell?](https://superuser.com/q/937987)

> In bash, a process that is already running in the foreground can be
> suspended by hitting control Z. You can then bring it back to the foreground
> with `fg` or let it continue running in the background with `bg`.  
>  Is there a way to do this with power shell? [This
> question](https://stackoverflow.com/questions/185575/powershell-equivalent-
> of-bash-ampersand-for-forking-running-background-proce) asks a related
> question for processes which haven't been started yet, but I want to know
> the answer for an already running process.
>
>
> bashでは、フォアグラウンドで既に実行されているプロセスは、コントロールZを押すことで一時停止できます。その後、`fg`でフォアグラウンドに戻すか、`bg`でバックグラウンドで実行し続けることができます。パワーシェルでこれを行う方法はありますか？この質問は、まだ開始されていないプロセスに関連する質問をしますが、すでに実行中のプロセスの答えを知りたいです。

質問自身へのコメントで、`ConEmu`というツールの機能で代替しているとあります。

> That isn't possible so far as I know. I just open a new tab in ConEmu if the
> current one is busy.  
>  私の知る限り、それは不可能です。 現在のタブがビジーの場合、ConEmuで新しいタブを開きます。

回答の方は

> You can use PowerShell job cmdlets to achieve your goals.  
>  There are 6 job related cmdlets available in PowerShell.
>
> 以下PowerShellのjob関連機能の列挙と簡単な説明が続く
>
> If interesting about it, you can download the sample [How to create
> background job in PowerShell](https://gallery.technet.microsoft.com/How-to-
> create-background-b2a6a8ee)

解決マークは無く、2018年に以下のUpvoteありコメントが付いています。

> While these may be helpful in some cases, they do not answer the question
> being asked. In OP's case (and in mine) he would like to send the job that
> is currently running to the background, without interrupting the job.
>
>
> これらは場合によっては役に立つかもしれませんが、尋ねられている質問には答えません。OPの場合（および私の場合）、ジョブを中断することなく、現在実行中のジョブをバックグラウンドに送信したいと考えています。

* * *

他方でまだ開発中ですが、「Windows
Terminal」というのが従来のコンソールやPowerShell/WSL/WSL2とも組み合わせて同様に使えるものとして登場するようです。  
[Windows その23 - モダンでパワフルな新しいターミナルアプリケーション、Windows Terminal登場・Windows
Consoleもオープンソースに](https://kledgeb.blogspot.com/2019/05/windows-23-windows-
terminalwindows.html)  
[Windows その24 - Windows
TerminalのFAQ](https://kledgeb.blogspot.com/2019/05/windows-24-windows-
terminalfaq.html)

プレビューとして短い間隔でアップデートされています。  
[PowerShellとLinuxシェルをタブ切り替え可能になる「Windows
Terminal」を試用する](https://www.atmarkit.co.jp/ait/articles/1907/02/news012.html)  
[新しいターミナルアプリ「Windows Terminal」が“Microsoft
Store”でプレビュー公開](https://forest.watch.impress.co.jp/docs/news/1192081.html)  
[「Windows
Terminal」新プレビュー版リリース--「大規模」なアップデート](https://japan.zdnet.com/article/35140992/)  
[「Windows Terminal」v0.4がリリース
～選択テキストをスタイル付きでコピー可能に](https://forest.watch.impress.co.jp/docs/news/1203872.html)

そして直接の関係有無は不明ですが、こんな情報があります。  
要望的には意味が無いかもしれませんが、WSL2では出来るかもと期待されているようです。  
本当にもしかしたらcmd.exeやPowerShellでも出来るかもしれません。  
[Wiki page OS Compatibility by tangent on 2019-07-22 21:44:09. - PiDP-8/I
Software – Artifact
Content](https://tangentsoft.com/pidp8i/artifact/0e8a485c3467895c)

> ## Windows Subsystem for Linux
>
> Terminal emulation and [pty](https://en.wikipedia.org/wiki/Pseudoterminal)
> handling have been a longstanding problem with WSL, and there were still
> bugs in it the last time I tried it, on 2019.05.11 with 64-bit Windows 10
> Pro 1803 running Ubuntu 18.04.02 LTS. It's much better than the tests we
> conducted back in 2017, however.  
>  ターミナルエミュレーションと[pty]処理はWSLの長年の問題であり、前回試したとき、Ubuntu 18.04.02
> LTSを実行する64ビットWindows 10 Pro 1803で2019.05.11にバグがありました。
> ただし、2017年に実施したテストよりもはるかに優れています。
>
> These problems mainly show up when running the simulator under GNU screen,
> as our `bin/pidp8i` wrapper does. In my latest attempt, the following would
> result in a "dead" screen session:  
>  これらの問題は、主にGNU screenでシミュレーターを実行するときに、 `bin / pidp8i`ラッパーと同様に現れます。
> 私の最新の試みでは、以下は「デッド」スクリーンセッションになります。
[code]

>     $ pidp8i start      ← start simulator under GNU screen
>     $ pidp8i            ← attach to screen session
>     Ctrl-A, d           ← detach; leave it running
>     $ pidp8i            ← reattach; reports it "dead"
>  
[/code]

>
> You can avoid these problems by running the simulator directly:  
>  シミュレーターを直接実行することにより、これらの問題を回避できます。
[code]

>      $ make run
>      $ bin/pdp8 boot/0.script
>  
[/code]

>
> ...and so forth.
>
> It is possible that the improvements announced at [Build
> 2019](https://news.microsoft.com/build2019/) to [WSL
> 2](https://devblogs.microsoft.com/commandline/announcing-wsl-2/) and [the
> Windows console](https://github.com/microsoft/Terminal) will solve these
> remaining pty and terminal emulation problems. Until they're addressed, the
> above choices are better options.  
>  [ビルド2019]で[WSL
> 2]および[Windowsコンソール]に発表された改善により、これらの残りのptyおよびターミナルエミュレーションの問題が解決される可能性があります。
> それらに対処するまで、上記の選択肢はより良いオプションです。

* * *

現在でもコマンドプロンプトウィンドウの表示/非表示やタスクバーへの表示/非表示の制御だけなら、cmdowというプログラムがあるようです。7までは対象と書いてありますが、こんな記事があるので、10でも動作はしているようです。  
[cmdow and keyboard focus](https://stackoverflow.com/q/41384224/9014308)

> cmdow utility running on Windows NT and windows 10

そのcmdowの概要  
[cmdow](https://ritchielawrence.github.io/cmdow/) / repository
[ritchielawrence/cmdow](https://github.com/ritchielawrence/cmdow)  
Synopsysの機械翻訳

> CmdowはNT4 / 2000 / XP /
> 2003/2008/7用のWin32コマンドラインユーティリティで、ウィンドウの一覧表示、移動、サイズ変更、名前変更、 **非表示/表示** 、
> **無効化/有効化** 、最小化、最大化、復元、アクティブ化/非アクティブ化、クローズを可能にします、殺されたなど。
>
>
> 小さなスタンドアロンの実行可能ファイルです。一時ファイルを作成することも、レジストリに書き込むこともありません。インストール手順はありません。実行するだけです。システムからすべてのトレースを完全に削除するには、削除します。
>
>
> Cmdowはバッチファイルプログラマーを念頭に置いて作成されました。Cmdowsの出力には特に注意が払われており、Windowsコマンドプロセッサ（cmd.exe）にある「FOR
> / F」コマンドで簡単に処理できます。

以下のQ&Aのベストアンサーではないその他の回答に情報がありました。  
[Windowsのバッチプログラム(.bat)を実行する際、ウィンドウを表示しない方法をお教えください。](http://q.hatena.ne.jp/1148004776)

おそらく、使っているのは以下のConsole関連のAPIでしょう。  
[Welcome to the Windows Console documentation!](https://docs.microsoft.com/en-
us/windows/console/)  
[Consoles](https://docs.microsoft.com/en-us/windows/console/consoles)  
[Console Functions](https://docs.microsoft.com/en-us/windows/console/console-
functions)

これらを使った関連?/類似?の記事が以下です。  
[バッチファイルからウィンドウをコントロールする方法がわかりたい](http://www7a.biglobe.ne.jp/~tsuneoka/win32sub2/9.html)  
[Windows開発/コンソール -
EternalWindows](http://eternalwindows.jp/windevelop/console/console00.html)

Windows10 1809から、擬似コンソールという機能が増えているようなので、これから類似の機能を持ったプログラムが作りやすくなるのかもしれません。  
[Microsoft Promising Improved Console Apps Support in Next Windows 10
Release](https://rcpmag.com/articles/2018/08/16/windows-pseudo-console-in-
windows-10.aspx)  
その一連のブログ記事の先頭  
[Windows Command-Line:
Backgrounder](https://devblogs.microsoft.com/commandline/windows-command-line-
backgrounder/)  
擬似コンソールの記事  
[Windows Command-Line: Introducing the Windows Pseudo Console
(ConPTY)](https://devblogs.microsoft.com/commandline/windows-command-line-
introducing-the-windows-pseudo-console-conpty/)

ちなみに、GNU Screenに関連する情報はこれでしょうかね。  
[screenコマンドの要点](https://qiita.com/ryounagaoka/items/8203e9c149b542986c92)  
[screen - コマンド (プログラム) の説明 - Linux コマンド集
一覧表](https://kazmax.zpp.jp/cmd/s/screen.1.html)

* * *

**直接は関係ないですが追加の諸々：**

Windowsで実行中のプロセスを停止/再開させる方法はあるようです。  
[How to suspend/resume a process in
Windows?](https://stackoverflow.com/q/11010165/9014308)  
[How can I freeze the execution of a
program?](https://stackoverflow.com/q/4062665/9014308)

しかし、プロセスの所属するセッションやデスクトップを変更する方法は無いようです。  
[Change running process session ID and
lpDesktop?](https://stackoverflow.com/q/9722622/9014308)

変更するのではなく、起動時に別のセッション(例えばUIを持たないサービス用のセッション0)を指定することは可能のようですね。  
[Escalate program out of Session
0](https://stackoverflow.com/q/17869522/9014308)  
[Runas in another Windows terminal
session](https://stackoverflow.com/q/26910831/9014308)  
[PsExec v2.2](https://docs.microsoft.com/ja-jp/sysinternals/downloads/psexec)

**Azure用** Windows10 Enterprise 1809以後には、マルチセッションという、Windows
Serverでしかできなかった、複数の対話型セッションを同時に実行できる新しいリモート デスクトップ セッション ホストがサポートされているとのこと。  
[Microsoft is readying multi-session support for Windows
10](https://www.zdnet.com/article/microsoft-is-readying-multi-session-support-
for-windows-10/)  
[Windows 10 Enterprise マルチセッションに関する FAQ](https://docs.microsoft.com/ja-
jp/azure/virtual-desktop/windows-10-multisession-faq)

> Windows 10 Enterprise マルチセッションは、Azure 用の Windows Virtual Desktop
> サービスに最適化されているため、オンプレミスの運用環境では実行できません。 運用目的で Azure の外部で Windows 10 Enterprise
> マルチセッションを実行することは、ライセンス契約違反です。

同様のことは、ライセンス違反でしょうが、以前からハックがあるようです。  
[stascorp/rdpwrap](https://github.com/stascorp/rdpwrap)

[Windows10で，Desktop＆RDP2ユーザの同時ログイン（2017年12月アップデート対応）](https://kougen.iobb.net/hobbygardens/article.php?id=65)  
[Multiple RDP (Remote Desktop) sessions in Windows
10](https://www.mysysadmintips.com/windows/clients/545-multiple-rdp-remote-
desktop-sessions-in-windows-10)  
[RDP Wrapper Library
のインストール](https://qiita.com/aoi70/items/47e521c6a310e3959b35)  
[RDP Wrapper
Libraryが突然使えなくなった！](https://qiita.com/murashi/items/2d497193a2224a7fdacf)  
[さらに RDP Wrapper Library が使えなくなって
fork先に変更した。](https://qiita.com/shooskay/items/3c0e28581097de7bb401)  
[RDP Wrapperでリモートデスクトップできないときの対処法 【Win10
Home】](https://tanisukestr.hatenablog.com/entry/2019/04/14/225533)


CC BY-SA 4.0
2019-09-13T14:47:27.630
59049
2019-09-15T23:53:36.483
2019-09-15T23:53:36.483
26370
26370
59018
answer


WindowStyleがHiddenの状態でpowershellとは別プロセスとして何らかのプロセスを起動したいだけであれば、Start-
Processで良いと思います。  
powershellコンソール内で実行するとpowershellを閉じれば終了しますが、Start-
Processは別プロセスとして実行されるため、コンソールを閉じても実行させ続けることができます。

ただし、Start-Processではstdout・stderrの受け取りが困難なため、その辺りを解決するには"Invoke-
Process"辺りで調べると良いでしょう。  
<https://tech.guitarrapc.com/entry/2014/12/14/075248>

既に実行しているプロセスのウィンドウを取得する場合はShowWindowAsyncを使用すれば出来そうです。  
起動時に指定するのが楽ですね。  
<https://blogs.technet.microsoft.com/brucecowper/2015/01/26/minimizing-
powershell-windows-while-executing/>

コンソールウィンドウ等に文字列を送る必要があれば、PostMessage等で可能です。  
killではなく正常終了させたい時などに。

これらを合わせればWindowsであってもLinux screenと同様に操作できると思います(screenは偉大ですね…)。

かなり端折っていると思うので、ご不明な点があれば質問下さい。


CC BY-SA 4.0
2019-10-11T09:01:33.597
59641
2019-10-11T09:01:33.597
36170
59018
answer