Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

バッチ処理 (Batch Scripts)

バッチ処理のパイプ「| の使い方が誤っています。」エラーの原因と対処について

投稿日:2020年11月2日 更新日:

<目次>

(1) バッチ処理のパイプ「| の使い方が誤っています。」エラーの原因と対処について
 (1-1) エラー概要
 (1-2) エラー原因
 (1-3) エラー対処

(1) バッチ処理のパイプ「| の使い方が誤っています。」エラーの原因と対処について

(1-1) エラーの概要

バッチファイルを実行した際に下記のエラーが発生しました。

| の使い方が誤っています。

パイプ「|」はforループのin句の中で「in (‘dir /b *.bat | find “Test”‘)」のようにコマンドを連結するために利用していました。

(エラーが起きたプログラム)

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

for /f "delims=" %%b in ('dir /b *.bat | find "Test"') do (
	echo %%b
)
ENDLOCAL

(図111)バッチを実行すると「| の使い方が誤っています。」と表示される

目次にもどる

(1-2) エラー原因

forコマンド内のパイプやリダイレクトは “^”(キャレット)を使ってエスケープする必要があり、それを実施していなかったのが今回の原因になります。”^”を前に付与して”^|”とする事で、ループの構文を解析する際に変換される事を防ぎます(=エスケープされると「|」は「’dir~~Test”‘」の文字列の中の一部として機能します)

rem ###修正前
for /f "delims=" %%b in ('dir /b *.bat | find "Test"')
rem ###修正後
for /f "delims=" %%b in ('dir /b *.bat ^| find "Test"')
ちなみにパイプ「|」はあるコマンドの出力(デフォルトの場合は標準出力STDOUT)の結果を取得し、それを次のコマンドの入力(デフォルトでは標準入力STDIN)に連携します。この機能を使う事で、あるコマンドの結果に更に次のコマンドを適用する事が可能になります。

目次にもどる

(1-3) エラー対処

「原因」に記載の通りパイプ「|」をキャレット「^」でエスケープします。

(修正版プログラム)

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

for /f "delims=" %%b in ('dir /b *.bat ^| find "Test"') do (
	echo %%b
)
ENDLOCAL

(実行結果)

(プログラム補足)

@echo off エコー機能をOFFにし、実行したコマンドの内容をechoさせないようにします。
コマンドの実行結果のみを表示したい場合などに付けます。
SETLOCAL ENABLEDELAYEDEXPANSION
rem ### 中略 ###
ENDLOCAL
遅延環境変数をセットしています。これをセットする事で、for文の処理を待たせて(遅延させて)、echoの処理が完了したら次のforの処理に移るように制御をします。これが無いとechoする前に次のforループに入ってしまい、変数が空になった状態でechoしてしまうため何も表示されない事象が起きてしまう。
for /f “delims=” %%b in (‘dir /b *.bat ^| find “Test”‘) do ( ■ for /F %変数 in (‘[コマンド]’) do (~)
forに「/F」オプションを付与する事で、in句内で指定したコマンドの実行結果を変数(%変数)に格納しています。

■dir /b *.bat ^| find “Test”
前半の「dir /b *.bat」が現在ディレクトリの内容を出力するコマンドで、後半の「find “Test”」が前半の結果からTestの文言を含むものを探します。

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-バッチ処理 (Batch Scripts)

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Windowsのバッチで日付(yyyymmdd形式)や時刻(hhmmss形式)を取得する方法

<目次> (1) Windowsのバッチで日付(yyyymmdd形式)や時刻(hhmmss形式)を取得する方法  (1-1) バッチで日付を取得する  (1-2) バッチで日付を取得する(yyyymm …

バッチでフォルダやファイルの存在チェックを行う方法~if exist文の活用~

<目次> (1) バッチでフォルダやファイルの存在チェックを行う方法~if exist文の活用~  (1-1) バッチでフォルダの存在チェックを行う方法  (1-2) バッチでファイルの存在チェックを …

WindowsでCドライブの空き容量を監視するバッチプログラムについて

(0)目次&概説 今回はWindowsマシンのCドライブ空き容量をチェックし、閾値との比較によってアラートメッセージを出したりするバッチプログラムの作成について紹介します。このバッチを使ってタスクスケ …

バッチでファイルパスやファイル名を取得する方法

<目次> (1) バッチでファイルパスやファイル名を取得する方法  (1-1) 構文  (1-2) コマンドのオプションについて  (1-3) サンプルプログラム 「for %%f in (&#822 …

バッチで見る「2>&1」の意味とリダイレクトの種類について

<目次> (1) バッチで見る「2>&1」の意味とリダイレクトの種類について  (1-1) 「2>&1」の意味  (1-2) 「2>&1」の各文字の意味  ( …

  • English (United States)
  • 日本語
Top