web-dev-qa-db-ja.com

PowerShellで「バッチジョブの終了(Y / N)」の確認を抑制するにはどうすればよいですか?

押すと Ctrl+C PowerShellでは、次の情報を受け取ります。

バッチジョブを終了しますか(Y/N)?

https://superuser.com/questions/35698/how-to-supress-terminate-batch-job-y-n-confirmation と同様ですが、WindowsPowerShellを除きます。

PowerShellは、CMDよりもバッチジョブを制御できますか?

17
mikemaccana

の動作は、PowerShellが原因ではなく、PowerShellが変更することもできませんPowerShellソースコードリポジトリ が含まれていないことからもわかります)プロンプトメッセージ)。

の動作は組み込みの_cmd.exe_-この場合、Powershellは_.cmd_を呼び出していますfile(バッチファイル)。これは_cmd.exe_によって解釈されます。

  • ターゲット実行可能ファイルの呼び出しを明示的に制御する場合は、Powershellに移動することでこれを修正できます-これには独自の考慮事項があることに注意してください。以下を参照してください。

  • ターゲット実行可能ファイルの呼び出しを明示的に制御しないと、運が悪くなります(サードパーティをインストールする意思がない限り_cmd.exe_置換)およびを押す必要があります Ctrl+C2回実行を終了します。

  • A [n ill-advised] workaround is to modify the _cmd.exe_ binary -を参照してください プロンプトを抑制するために_cmd.exe_実行可能ファイルにパッチを適用する方法の説明が記載された記事 。さらに、機能リクエストを GitHub に投稿して、この動作をソースで修正するようにリクエストできますが、下位互換性のために発生する可能性は低いです。

動作を示すには:

例では、Node.jsがインストールされており、_node.exe_がPATHに含まれていることを前提としています。

まず、_node.exe_を直接呼び出します。タイトなループでは、を押す必要があります。 Ctrl+C プロセスを終了します。

_PS> node -e "while (true);"
_

ご覧のとおり、を押します Ctrl+C即座にプロセスを終了します-確認プロンプトなし。

次に、同じコマンドを呼び出すサンプルバッチファイルを作成し、そのバッチファイルを呼び出します。

_PS> "@echo off`nnode -e `"while (true);`"" | Set-Content test.cmd
PS> ./test.cmd
_

ご覧のとおり、を押します Ctrl+C 不要なTerminate batch job (Y/N)?プロンプトが表示されるようになりました。 (_cmd.exe_からバッチファイルを実行した場合も同じ動作になります。)

gulpcmdファイルであることを示すには:

gulp のCLIを介してコマンドを実行していると言います。

Windowsでは、gulp CLIのエントリポイントは_gulp.cmd_-つまり、バッチファイルこれがnpmの一般的な動作方法です-JSファイルまたはシェルスクリプトとして実装されたパッケージ「バイナリ」(実行可能ファイル)。

gulpが_gulp.cmd_を呼び出すことは、次のように確認できます。

_# Execute from a project folder that has `gulp` installed as a dependency.
# If `gulp` is installed *globally* 
# Note: CLI `npx` requires npm version 5.2.0+
PS C:\some\NodeJs\project> npx where gulp
_

次のようなものが表示されます。

_C:\some\NodeJs\project\node_modules\.bin\gulp
C:\some\NodeJs\project\node_modules\.bin\gulp.cmd
_

_where.exe_には、extension-lessnix-シェルスクリプト、_...\gulp_もリストされていることに注意してください。ただし、_cmd.exe_/Powershellからは、このようなシェルスクリプトを直接実行することはできず、実行されるのは_...\gulp.cmd_ --- バッチファイル-です。
(疑わしい場合は、_@set /p dummy="Press a key"_ファイルの先頭に_gulp.cmd_などのコマンドを配置すると、gulpを呼び出すとこのコマンドが実行されることがわかります。 _.cmd_拡張子なし。
また、no _gulp.exe_があることに注意してください。)

より一般的には、Windowsでは、プロジェクトの_node_modules\.bin_サブフォルダーには、プロジェクトがローカルで依存するパッケージに付属するCLIのCLIエントリポイントのpairsが含まれます。

  • _node_modules\.bin\<some-cli>_はUnixシェルスクリプトです(その実行中のインタープリターは Shebang line を介して制御されます)。
  • _node_modules\.bin\<some-cli>.cmd_は、Windowsのヘルパーバッチファイルです。

今後の考慮事項:

Npmモジュールのコンテキストでは、PowerShellスクリプト(_*.ps1_)がWindowsのヘルパースクリプトとして使用された場合、問題は解決します。これを行うためのnpmyarnおよび同様のソフトウェアのチケットがあります。いくつかの欠点もあります。

  • _*.ps1_ファイルは、PowerShellの外部、特に_cmd.exe_およびファイルエクスプローラーから直接実行することはできません(変更は簡単ではありません)。

  • Windows 10の時点で、PowerShellはまだデフォルトのシェルとして_cmd.exe_を完全に置き換えていません。

PowerShellからと呼ばれると、_*.ps1_ファイルが検出され、インプロセスで実行されるため、現時点で考えられる妥協案は、npmプロジェクトがまた提供することです。 _*.ps1_ヘルパースクリプト。同じ名前の_*.cmd_ファイルよりも優先されます。

10
mklement0

他の回答ノートと同様に、正しい修正は、cmdスクリプトをps1バージョンに置き換えることです。

ただし、ハイパーシェルのユーザー向けの別の回避策ハイパーはい、自動的にyにヒットするプラグイン =プロンプトが表示されたとき。

enter image description here

2
mikemaccana