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

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

関連記事

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

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

バッチでログファイルを出力+ファイル名に日時間を付与する

<目次> (1) バッチでログファイルを出力+ファイル名に日時間を付与する  (1-1) 構文  (1-2) サンプルプログラム  (1-3) 簡単な操作手順動画 (1) バッチでログファイルを出力+ …

バッチ処理をX秒間待たせる(停止させる)方法

<目次> (1) バッチ処理をX秒間待たせる(停止させる)方法  (1-1) 構文①  (1-2) 構文①サンプルプログラム  (1-3) 構文②  (1-4) 構文②サンプルプログラム (1) バッ …

バッチファイルでSQLServerに接続する方法~sqlcmdの各オプション挙動を実例で紹介~

<目次> (1) バッチファイルでSQLServerに接続する方法  (1-1) 構文  (1-2) オプションの説明  (1-3) 各オプションの挙動をサンプルで確認 (1) バッチファイルでSQL …

バッチ処理の使用例やシステムにおける役割をご紹介

  <目次> (1) バッチ処理の使用例やシステムにおける役割をご紹介  (1-1) バッチ処理の利用方針(大方針)  (1-2) バッチ処理の使用例  (1-3) バッチ処理を運用する仕組 …

  • English (United States)
  • 日本語
Top