バッチ基本 リダイレクト、パイプ、文字列の操作、ファイルの操作まとめ

前回のつづき

リダイレクト、パイプ

標準出力と標準エラー出力

通常コマンドを入力し実行すると出力結果はモニタで確認できるようにコマンドプロンプトの画面上に出力されます。この出力結果のことは「標準出力」といいます。コマンドの文法が間違っている場合などエラーを伝える文章が表示された場合、通常の出力結果と違うため標準出力と区別します。そしてこの出力結果のことを「標準エラー出力」といいます。

実行結果の出力先

実行結果の出力先は通常ディスプレイになります。実はこの出力先はユーザーで自由に決めることができます。出力先をファイルにした場合はリダイレクトといい、出力先をほかのコマンドにする場合はパイプといいます。

ログ

出力結果をログとして残しておきたい場合はファイルにリダイレクトさせます。標準出力と標準エラー出力を別のファイルに分けることもできます。

リダイレクト

コマンドとファイルの間に大なり(>)を入れることでリダイレクトさせることができます。

[コマンド] > [ファイル]

通常の大なり(>)の場合は出力結果は上書きされますが、大なり大なり(>>)の場合は上書きされることなく追記することができます。
[コマンド] >> [ファイル]

パイプ

コマンドとコマンドの間に(|)を入れることでパイプすることができます。

[コマンド] | [コマンド]

例:リダイレクト、パイプ

@echo off

rem echoの出力内容をtest.txtにリダイレクト
echo Car > test.txt
echo Apple >> test.txt
echo Desk >> test.txt 
echo Bag >> test.txt

rem ファイルの表示内容をsortコマンドにパイプしさらに出力結果をresult.txtにリダイレクト
type test.txt | sort > result.txt

pause

結果

test.txt
Car
Apple
Desk
Bag

result.txt
Apple 
Bag
Car 
Desk

コマンドの結果を出力させない

コマンド  > nul
@echo off
net user | findstr /I guest > nul
pause

文字列の操作

プログラムでは特定の文字を切り出したり、文字を置き換えたりと文字列の操作を頻繁に行います。batでもこれらの操作行うためいろいろなコマンドが用意されています。

・文字列切り出し・置き換え
%[変数名]:~[開始位置],[文字数]%

%[変数名]:~m%  m文字目から、最後まで
%[変数名]:~m,n%    m文字目から、n文字分
%[変数名]:~m,-n%   m文字目から、最後のn文字分を除いたもの
%[変数名]:~-m% 後ろからm文字目から、最後まで
%[変数名]:~-m,n%   後ろからm文字目から、n文字分
%[変数名]:~-m,-n%  後ろからm文字目から、最後のn文字分を除いたもの
%[変数名]:a=b% 文字aを文字bに置換

日付/時刻

日付と時刻は形式がいろいろあり表記方法に悩むことがあります。
これを置き換えと切り出しを使ってどんな表記形式でも対応できるようにします。

@echo off
set date_tmp=%date:/=%
set time_tmp=%time: =0%
set yyyy=%date_tmp:~0,4%
set yy=%date_tmp:~2,2%
set mm=%date_tmp:~4,2%
set dd=%date_tmp:~6,2%
set hh=%time_tmp:~0,2%
set mi=%time_tmp:~3,2%
set ss=%time_tmp:~6,2%
echo %yyyy%-%mm%-%dd% %hh%:%mi%:%ss%
echo %yyyy%/%mm%/%dd% %hh%:%mi%:%ss%
pause

コマンドの出力結果から指定文字列を検索

findstr [オプション] "[指定文字列]" [検索対象ファイル]

よく使うオプション
/S: サブディレクトリを全部、再帰する。(シンボリックリンクも辿るかは未検証)
/I: アルファベットの大小文字を区別しない。(デフォだと区別する)
/X: 完全一致する行だけ。
/N: 行番号も表示する。(デフォだとファイル名だけ)
@echo off
net user | findstr /I guest
pause

ファイル操作

コピー

copy

copy [source_file] [destination_file]
低機能で単一のファイルのコピーに使う

xcopy

・xcopy [source_file] [destination_file]
copyより高機能。ファイルをディレクトリ構造ごとコピーできる

・よく使うオプション
/D:MM/DD/YYYY   指定した日付以降に更新されたファイルのみコピーする
/D  コピー先に同名のファイルが存在する場合に更新日が新しいファイルのみコピーする
/P  コピー前に確認メッセージを表示する
/S  ファイルが存在する場合のみコピーするサブディレクトリまで含めてディレクトリごとコピーする
/E  ファイルが存在しなくてもコピーするサブディレクトリまで含めてディレクトリごとコピーする
/EXCLUDE:file name  指定したファイルをコピー対象から外す(複数ファイル指定時は"+"でくくる)
/W  キー入力を待ってコピーを開始する
/C  コピー時のエラーを無視する
/I  コピー先のディレクトリが存在しない場合は新規にディレクトリを作成する
/Q  コピーしたファイル名を表示しない
/H  隠しファイルやシステムファイルも全てコピーする
/T  ファイルが存在するディレクトリのディレクトリのみコピーする
/O  ファイルの所有権やアクセス権限もそのままコピーする
/Y  同名のファイルが存在する場合、上書きの確認を行わない
@echo off
set source=%USERPROFILE%\Desktop\source
set destination=%USERPROFILE%\Desktop\destination

xcopy /S /C /I /Q /Y %source%\* %destination%

pause

robocopy

・robocopy [source_file] [destination_file]
主にバックアップに使う。フォルダの同期が可能。コピー元、コピー先の差分を確認してコピーすることが可能。

・よく使うオプション
/B  バックアップ専用の権限を持ったアカウント(バックアップモード)でファイルをコピーする
/MIR    ディレクトリツリーをミラー化する 増減両方の差分を反映する
/XO     古いファイルを除外する
/E      空のディレクトリを含むサブディレクトリをコピーする
/COPY:Flag  ファイルにコピーする情報を指定する(既定値は/COPY:DAT)
┣/COPY:DAT 既定値
┗/COPY:DATS フォルダのアクセス権もコピー
/R:1    コピー失敗時に何回再試行 (Retry) するか。1 の場合は、失敗した後にもう一度だけ再試行する。
/W:1    コピー失敗と判断するまでの待ち時間 (Wait time)。
/LOG:FileName   ログファイルに状態を出力する(既存ファイルを上書く)
/LOG+:FileName  ログファイルに状態を出力する(既存ファイルに追記)
/NP     進捗非表示
/NFL    コピー成功時にはファイル名のログ出力しない
/NDL    コピー成功時にはフォルダ名のログを出力しない
/L      テストモード(ドライラン)。
@echo off
set source=%~dp0\source
set destination=%~dp0\destination

robocopy %source% %destination% /B /E /R:1 /W:1 /LOG:%destination%\log.txt /NP

pause

ファイルの移動や名前の変更

move [source_file] [destination_file]

・オプション
/Y  上書き時に確認しない
/-Y 上書き時に確認する

ディレクトリを作成する

mkdir [new directory name]

ディレクトリを削除する

rd [directory name]

・オプション
/s  ファイルやサブディレクトリも含めて削除する
/q  /sで削除する際に確認メッセージを表示しない

ファイルを削除

del [directory name]

・オプション
/P  ファイルの削除前に確認メッセージを表示する
/F  読み取り専用ファイルを削除する
/S  指定したファイルを全てのサブディレクトリから削除し、削除したファイル名を表示する
/Q  削除前に確認メッセージを表示しない

管理者権限を持っているかどうか

openfilesは使用中の共有ファイルを表示するコマンドだが、管理者権限の持ったユーザーのみ使用可能。
これを使って管理者権限をもっているか判断する。

@echo off
openfiles > NUL 2>&1 
if NOT "%ERRORLEVEL%" == "0" goto user
echo 【○】管理者権限です
goto END
:user
echo 【×】管理者権限ではありません。
:END
pause

次回はよく使うコマンドまとめです。
ユーザー操作、レジストリ操作、タスクスケジュールなど

シェアする

  • このエントリーをはてなブックマークに追加

フォローする