「エラー: 入力のリダイレクトはサポートされていません。今すぐプロセスを終了します。」の原因と対処法

プログラミング・IT

Windowsでバッチファイル(.batや.cmd)を実行したとき、突然「エラー: 入力のリダイレクトはサポートされていません。今すぐプロセスを終了します。」というエラーメッセージが表示されて困ったことはありませんか?

自動化タスクやジョブスケジューラーでスクリプトを実行しようとしたのに、コマンドプロンプトでは正常に動くのに、バックグラウンドで実行すると必ずこのエラーが出る…。

実は、このエラーはWindowsのTIMEOUTコマンドが原因で発生する、よく知られた問題です。

今回は、このエラーが発生する理由と、実際に効果のある5つの対処法について詳しく解説していきます。

スポンサーリンク

エラー「入力のリダイレクトはサポートされていません」とは?

表示されるエラーメッセージ

このエラーは、以下のようなメッセージで表示されます。

日本語版Windows

エラー: 入力のリダイレクトはサポートされていません。今すぐプロセスを終了します。

英語版Windows

ERROR: Input redirection is not supported, exiting the process immediately.

フランス語版Windows

Erreur : la redirection de l'entrée n'est pas prise en charge. Fin immédiate du processus.

ドイツ語版Windows

FEHLER: Die Eingabeumleitung wird nicht unterstützt. Prozess wird unverzüglich beendet.

どんな時に発生するか

このエラーは、特定の条件下でTIMEOUTコマンドを実行したときに発生します。

発生する主なケース

  • バッチファイル(.bat / .cmd)をバックグラウンドで実行
  • Windowsタスクスケジューラーからバッチファイルを実行
  • ジョブスケジューラー(Job Director、IBM Workload Scheduler、JS7 JobSchedulerなど)から実行
  • Jenkinsのビルドジョブで実行
  • AnsibleからWindows向けバッチファイルを実行
  • サービスとして登録したアプリケーションから実行
  • VS CodeのJupyter NotebookやInteractive Windowで実行
  • PowerShellから標準入力をリダイレクトして実行

正常に動作するケース

  • コマンドプロンプトで対話的(インタラクティブ)に実行
  • 手動でバッチファイルをダブルクリックして実行

影響を受けるシステム

このエラーは、すべてのWindowsバージョンで発生する可能性があります。

  • Windows Server(2008以降)
  • Windows 7 / 8 / 10 / 11
  • Windows Server 2012 / 2016 / 2019 / 2022

エラーが発生する根本的な原因

TIMEOUTコマンドの仕様

このエラーの根本原因は、TIMEOUTコマンドの設計上の仕様にあります。

TIMEOUTコマンドとは

TIMEOUTは、指定した秒数だけ処理を一時停止(待機)させるWindowsの標準コマンドです。

TIMEOUT /T 10

上記のコマンドは、10秒間待機してから次の処理に進みます。

TIMEOUTコマンドの特徴

  1. 対話的(インタラクティブ)な使用を前提としている
  • ユーザーがキーボードで操作できることを想定
  • 待機中に任意のキーを押すと、待機を中断できる
  1. 標準入力(stdin)からキーボード入力を受け付ける
  • 常にキーボードからの入力を監視している
  • 標準入力がリダイレクトされていると動作しない

なぜバッチファイルで動かないのか

バッチファイルをバックグラウンドで実行する環境(ジョブスケジューラーなど)では、プログラムの出力や入力を管理するために標準入力のリダイレクトを使用します。

標準入力のリダイレクトとは

通常、プログラムの入力元(標準入力)はキーボードです。しかし、リダイレクトを使うと、ファイルや別のプログラムから入力を受け取るように変更できます。

問題の発生メカニズム

  1. ジョブスケジューラーなどがバッチファイルを実行する
  2. 出力をログファイルに保存するため、標準入力をリダイレクトする
  3. TIMEOUTコマンドが実行される
  4. TIMEOUTはキーボードからの入力を期待しているが、標準入力がリダイレクトされているため、キーボードにアクセスできない
  5. エラーメッセージを表示して、プログラムを終了する

/NOBREAKオプションでも解決しない

TIMEOUTコマンドには/NOBREAKというオプションがあります。

TIMEOUT /T 10 /NOBREAK

このオプションは、「Ctrl+C以外のキー入力を無視する」という意味ですが、標準入力のリダイレクトの問題は解決しません

/NOBREAKは単にキー入力を無視するだけで、標準入力がリダイレクトされている状態でTIMEOUTコマンドを実行可能にするわけではないのです。

エラーの対処法

【対処法1】PINGコマンドで代用する(最もおすすめ)

TIMEOUTコマンドの代わりに、PINGコマンドを使って一定時間待機させる方法です。

この方法は、標準入力のリダイレクトに影響されないため、最も確実で広く使われています。

基本的な使い方

ping 127.0.0.1 -n 11 > nul

パラメータの説明

  • 127.0.0.1:ローカルホスト(自分自身のコンピューター)のIPアドレス
  • -n 11:pingを11回実行(11回目まで待機)
  • > nul:出力を画面に表示しない

待機時間の計算方法

Pingコマンドは、各実行の間に1秒待機します。

待機時間(秒) = (pingの実行回数 - 1)

具体例

rem 3秒待機
ping 127.0.0.1 -n 4 > nul

rem 5秒待機
ping 127.0.0.1 -n 6 > nul

rem 10秒待機
ping 127.0.0.1 -n 11 > nul

rem 30秒待機
ping 127.0.0.1 -n 31 > nul

rem 60秒待機(1分)
ping 127.0.0.1 -n 61 > nul

元のTIMEOUTコマンドとの対応表

TIMEOUTコマンド代替のPINGコマンド
TIMEOUT /T 3ping 127.0.0.1 -n 4 > nul
TIMEOUT /T 5ping 127.0.0.1 -n 6 > nul
TIMEOUT /T 10ping 127.0.0.1 -n 11 > nul
TIMEOUT /T 30ping 127.0.0.1 -n 31 > nul
TIMEOUT /T 60ping 127.0.0.1 -n 61 > nul

実装例

@echo off
echo 処理を開始します
echo.
echo 5秒待機します...
ping 127.0.0.1 -n 6 > nul
echo.
echo 待機完了。次の処理に進みます。

注意点

  • 必ず127.0.0.1(ローカルホスト)を使用してください。外部のIPアドレスを使うと、ネットワークエラーが発生する可能性があります
  • pingの回数は、待機したい秒数より1大きい数を指定します

【対処法2】WAITFORコマンドを使う

WAITFORコマンドを使って待機する方法です。

WAITFORは、他のプロセスからの信号を待つコマンドですが、タイムアウト機能を使って一定時間待機させることができます。

基本的な使い方

waitfor SomethingThatIsNeverHappening /t 10 2>nul

パラメータの説明

  • SomethingThatIsNeverHappening:存在しないシグナル名(何でもOK)
  • /t 10:タイムアウト時間を10秒に設定
  • 2>nul:エラーメッセージを非表示にする

待機時間の指定

WAITFORコマンドでは、秒数を直接指定できます。

rem 5秒待機
waitfor DummySignal /t 5 2>nul

rem 10秒待機
waitfor DummySignal /t 10 2>nul

rem 30秒待機
waitfor DummySignal /t 30 2>nul

rem 100秒待機
waitfor DummySignal /t 100 2>nul

元のTIMEOUTコマンドとの対応表

TIMEOUTコマンド代替のWAITFORコマンド
TIMEOUT /T 5waitfor DummySignal /t 5 2>nul
TIMEOUT /T 10waitfor DummySignal /t 10 2>nul
TIMEOUT /T 30waitfor DummySignal /t 30 2>nul
TIMEOUT /T 100waitfor DummySignal /t 100 2>nul

実装例

@echo off
echo 処理を開始します
echo.
echo 30秒待機します...
waitfor DummySignal /t 30 2>nul
echo.
echo 待機完了。次の処理に進みます。

注意点

  • 2>nulを忘れると、タイムアウト時にエラーメッセージが表示されます
  • 最大待機時間は99999秒(約27時間)です

【対処法3】PowerShellのStart-Sleepコマンドレットを使う

バッチファイルからPowerShellを呼び出して、Start-Sleepコマンドレットを使う方法です。

基本的な使い方

powershell -Command "Start-Sleep -Seconds 10"

待機時間の指定

rem 3秒待機
powershell -Command "Start-Sleep -Seconds 3"

rem 5秒待機
powershell -Command "Start-Sleep -Seconds 5"

rem 10秒待機
powershell -Command "Start-Sleep -Seconds 10"

rem 30秒待機
powershell -Command "Start-Sleep -Seconds 30"

rem 1分待機
powershell -Command "Start-Sleep -Seconds 60"

元のTIMEOUTコマンドとの対応表

TIMEOUTコマンド代替のPowerShellコマンド
TIMEOUT /T 3powershell -Command "Start-Sleep -Seconds 3"
TIMEOUT /T 5powershell -Command "Start-Sleep -Seconds 5"
TIMEOUT /T 10powershell -Command "Start-Sleep -Seconds 10"
TIMEOUT /T 30powershell -Command "Start-Sleep -Seconds 30"

実装例

@echo off
echo 処理を開始します
echo.
echo 10秒待機します...
powershell -Command "Start-Sleep -Seconds 10"
echo.
echo 待機完了。次の処理に進みます。

注意点

  • PowerShellの起動に数秒かかるため、短い待機時間(1〜2秒)の場合は不正確になる可能性があります
  • PowerShellが無効化されている環境では使用できません

【対処法4】外部のsleep.exeツールを使う

Windowsには標準でsleepコマンドがありませんが、外部ツールとしてsleep.exeを導入する方法があります。

利用可能なsleep.exeツール

  1. Microsoft Windows Server 2003 Resource Kit Tools
  • Microsoftが提供する公式ツール
  • ただし、Windows Server 2003用のため古い
  1. Job Directorのsleep.exe
  • Job Directorに付属しているsleep.exe
  • Job Directorユーザーのみ利用可能
  1. その他のオープンソースツール
  • GitHubなどで公開されているsleep.exe
  • セキュリティポリシーで制限される場合がある

基本的な使い方

sleep.exe 10

上記のコマンドは、10秒間待機します。

実装例

@echo off
echo 処理を開始します
echo.
echo 10秒待機します...
sleep.exe 10
echo.
echo 待機完了。次の処理に進みます。

注意点

  • 外部ツールのインストールが必要
  • セキュリティポリシーで外部ツールの使用が制限されている環境では使用できない
  • ツールの配置場所(PATHの通った場所)に注意

【対処法5】カスタムtimeout.exeを作成する(上級者向け)

元のTIMEOUTコマンドと同じ動作をする、リダイレクト対応版のtimeout.exeを自作する方法です。

作成方法

  1. 以下の内容でtimeout.cmdファイルを作成します:
@echo off
setlocal EnableDelayedExpansion

rem パラメータの解析
set "seconds=1"
if "%~1"=="/t" set "seconds=%~2"
if "%~1"=="/T" set "seconds=%~2"
if "%~2"=="/t" set "seconds=%~3"
if "%~2"=="/T" set "seconds=%~3"

rem pingコマンドで待機を実現
set /a "pings=!seconds!+1"
ping 127.0.0.1 -n !pings! > nul

exit /b 0
  1. bat2exeなどのツールを使って、timeout.cmdtimeout.exeに変換します
  2. 作成したtimeout.exeをバッチファイルと同じディレクトリ、またはPATHの通った場所に配置します

実装例

配置後は、通常のTIMEOUTコマンドと同じように使用できます。

timeout.exe /t 10
timeout.exe /T 5
timeout.exe /t 30 /nobreak

注意点

  • bat2exeなどの変換ツールが必要
  • セキュリティポリシーで実行ファイルの配置が制限されている環境では使用できない
  • 元のTIMEOUTコマンドよりも高度な知識が必要

各対処法の比較

対処法メリットデメリットおすすめ度
PINGコマンド・標準コマンドで追加インストール不要
・どの環境でも動作
・最も広く使われている
・待機時間の計算が少し分かりにくい★★★★★
WAITFORコマンド・標準コマンドで追加インストール不要
・秒数を直接指定できる
・エラーメッセージの非表示処理が必要★★★★☆
PowerShell・分かりやすい構文
・秒数を直接指定できる
・起動に時間がかかる
・PowerShellが無効の環境では使えない
★★★☆☆
sleep.exe・構文がシンプル
・UNIXのsleepと同じ感覚で使える
・外部ツールのインストールが必要
・セキュリティ制限の可能性
★★☆☆☆
カスタムtimeout.exe・元のTIMEOUTコマンドと同じ構文・作成に手間がかかる
・配置場所の管理が必要
★☆☆☆☆

推奨

特別な理由がない限り、PINGコマンドを使うのが最も確実でおすすめです。

エラーが解決しない場合のチェックポイント

バッチファイルにTIMEOUTコマンドが含まれていないか確認

バッチファイルやスクリプト内に、TIMEOUTコマンドが残っていないか確認します。

確認方法

  1. バッチファイルをテキストエディタで開きます
  2. 「TIMEOUT」で検索します(Ctrl+Fキー)
  3. 見つかったTIMEOUTコマンドをすべて代替コマンドに置き換えます

検索すべきパターン

  • TIMEOUT(すべて大文字)
  • timeout(すべて小文字)
  • Timeout(先頭のみ大文字)

呼び出し先のバッチファイルも確認

メインのバッチファイルから別のバッチファイルを呼び出している場合、呼び出し先にもTIMEOUTコマンドが含まれている可能性があります。

確認方法

  1. バッチファイル内のCALLコマンドを探します
  2. 呼び出されているすべてのバッチファイルを確認します
  3. 見つかったTIMEOUTコマンドをすべて代替コマンドに置き換えます

ベンダー提供のスクリプトの場合

ソフトウェアベンダーが提供しているインストールスクリプトなどの場合、スクリプトを直接編集することが推奨されていない場合があります。

対処方法

  1. ベンダーのサポートに問い合わせる
  2. スクリプトのコピーを作成して編集する
  3. 最新版のスクリプトを確認する(修正されている可能性がある)

ログファイルを確認

どのコマンドでエラーが発生しているか特定するため、ログファイルを確認します。

ログの確認方法

ジョブスケジューラーやタスクスケジューラーの実行ログを見て、エラーが発生した行を特定します。

よくある質問

Q1:コマンドプロンプトで実行すると正常に動くのに、タスクスケジューラーで実行するとエラーが出ます

A:これはまさにこの記事で説明している典型的な症状です。
コマンドプロンプトは対話的(インタラクティブ)な環境なので、TIMEOUTコマンドが正常に動作します。

しかし、タスクスケジューラーはバックグラウンドで実行されるため、標準入力がリダイレクトされ、TIMEOUTコマンドがエラーになります。対処法1〜5のいずれかを使って、TIMEOUTコマンドを代替コマンドに置き換えてください。

Q2:pingコマンドで待機する方法は、正確な秒数を指定できますか?

A:はい、pingコマンドは1秒間隔で実行されるため、秒単位で正確に待機できます。ただし、ミリ秒単位の精密な待機はできません。ミリ秒単位の精密な待機が必要な場合は、PowerShellのStart-Sleepコマンドレットを使用してください:

Start-Sleep -Milliseconds 1500  # 1.5秒待機

Q3:TIMEOUT /NOBREAKオプションを付けてもエラーが出ます

A:/NOBREAKオプションは、「Ctrl+C以外のキー入力を無視する」という意味で、標準入力のリダイレクトの問題を解決するものではありません。そのため、バックグラウンド実行時にはエラーが発生します。この問題を解決するには、TIMEOUTコマンド自体を使わず、pingコマンドなどの代替手段を使用する必要があります。

Q4:Jenkinsでバッチファイルを実行すると必ずこのエラーが出ます

A:JenkinsはバッチファイルをバックグラウンドのWindowsシェル環境で実行するため、標準入力がリダイレクトされています。そのため、TIMEOUTコマンドは使用できません。解決策として、バッチファイル内のすべてのTIMEOUTコマンドをpingコマンドに置き換えてください。例えば:

rem 変更前
TIMEOUT /T 10

rem 変更後
ping 127.0.0.1 -n 11 > nul

Q5:外部ツールのsleep.exeをインストールできない環境ですが、他に方法はありますか?

A:はい、あります。外部ツールが使用できない環境では、Windowsの標準コマンドを使った方法が最適です。特にpingコマンドは、追加のインストールが不要で、どのWindows環境でも使用できるため、最もおすすめです。pingコマンドの使い方は、対処法1を参照してください。

まとめ

「エラー: 入力のリダイレクトはサポートされていません。今すぐプロセスを終了します。」は、WindowsのTIMEOUTコマンドをバックグラウンドで実行したときに発生するエラーです。

根本的な原因:

TIMEOUTコマンドは対話的(インタラクティブ)な使用を前提として設計されており、標準入力がリダイレクトされている環境では動作しません。

発生する環境:

  • バッチファイルをバックグラウンドで実行
  • Windowsタスクスケジューラー
  • ジョブスケジューラー(Job Director、IBM Workload Scheduler、JS7など)
  • Jenkins
  • Ansible
  • サービスとして登録したアプリケーション
  • VS Code Jupyter Notebook

効果的な対処法(推奨順):

  1. PINGコマンドで代用(最もおすすめ)
   ping 127.0.0.1 -n 11 > nul  # 10秒待機
  1. WAITFORコマンドを使用
   waitfor DummySignal /t 10 2>nul  # 10秒待機
  1. PowerShellのStart-Sleepを使用
   powershell -Command "Start-Sleep -Seconds 10"
  1. 外部のsleep.exeツールを使用
   sleep.exe 10
  1. カスタムtimeout.exeを作成(上級者向け)

重要なポイント

  • /NOBREAKオプションを付けても問題は解決しません
  • 特別な理由がない限り、pingコマンドを使うのが最も確実です
  • 呼び出し先のバッチファイルも含めて、すべてのTIMEOUTコマンドを置き換える必要があります

バッチファイル内のすべてのTIMEOUTコマンドを代替コマンドに置き換えることで、エラーを完全に解決できます!

コメント

タイトルとURLをコピーしました