なにげにぷろぐらまーWiki - Windows - バッチファイル

目次

コマンド

xcopy


ファイルをディレクトリ構造ごとコピーする
http://www.k-tanaka.net/cmd/xcopy.php

xcopy [source file] [target file] (option)

●使用例
xcopy c:\data\* d:\data /D /I /Z /Y /F /E

C:\data 以下のファイルを全て d:\data へコピー。

オプション
  • /D : 同じファイルが有る場合は更新日が新しい時だけコピー
  • /I : コピー先のディレクトリがない場合は、ディレクトリを作成する
  • /Z : ネットワーク経由のコピーでネットワーク切断が発生した場合、コピーを再開できるようにする
  • /Y : 同名ファイルが存在する場合、確認なしで上書き
  • /F : コピー元とコピー先のファイル名を詳細表示
  • /E : ファイルが存在しなくてもディレクトリごとコピー

robocopy


Linux の rsync 的なコピーコマンド。

Windows Vista 以降、Windows Server 2008 以降では標準コマンドとして用意されている。
Windows 2000, XP, Windows Server 2003 はリソースキットをダウンロードして利用可能。

Windows OS向けリソースキット・ツールを入手する
http://www.atmarkit.co.jp/fwin2k/win2ktips/379resk...


以下、自分でよく利用するオプション。

使用法:: ROBOCOPY コピー元 コピー先 [ファイル [ファイル]...] [オプション]

コピー元 :: コピー元ディレクトリ (ドライブ:\パスまたは \\サーバー\共有\パス)。
コピー先 :: コピー先ディレクトリ (ドライブ:\パスまたは \\サーバー\共有\パス)。
ファイル :: コピーするファイル (名前/ワイルドカード: 既定値は「*.*」です)
オプション説明
/Sサブディレクトリをコピーしますが、空のディレクトリはコピーしません。
/E空のディレクトリを含むサブディレクトリをコピーします。
/PURGE既にコピー元に存在しないコピー先のファイル/ディレクトリを削除します。
/COPY:コピーフラグファイルにコピーする情報 (既定値は /COPY:DAT)。
(コピーフラグ: D= データ、A= 属性、T= タイムスタンプ)。
(S= セキュリティ =NTFS ACL、O= 所有者情報、U= 監査情報)。
/MIRディレクトリ ツリーをミラー化します (/E および /PURGE と同等)
/LOG:ファイルログ ファイルに状態を出力します (既存のログを上書きします)。
/LOG+:ファイルログ ファイルに状態を出力します (既存のログ ファイルに追加します)。
/NP進行状況なし - コピーの完了率を表示しません。
/TEEコンソール ウィンドウとログ ファイルに出力します。
/R:n失敗したコピーに対する再試行数: 既定値は 1,000,000。
/W:n再試行と再試行の間の待機時間: 既定値は、30 秒です。
/REG既定の設定としてレジストリに R:n と /W:n を保存します。

その他

WindowsからNASにコピーする際、次のようなエラーが出力されることがある。
(詳細は調べていないが、LAN内でWindowsからLinuxへコピーする際?)

30 秒間待機しています... 再試行しています...
2015/02/05 01:59:03 エラー 5 (0x00000005) ファイル属性を変更しています m:\temp\
アクセスが拒否されました。

この問題を回避するには、コピーの際に属性情報を含めないようにすれば良いようです。

robocopy d:\temp m:\temp /copy:DT

copyオプションのデフォルト値は DAT
D:データ
A:属性情報
T:日付情報

文字列操作

部分文字列


文字列の5番目から2文字を抽出。(一文字目が0番目)

C:\>set V=ABCDEFGHIJKL
C:\>echo %V:~5,2%
FG
参考サイト

置換


文字列 "/" を " "(空白) に置換する

C:\>set dt=%date%
C:\>set dt
dt=2011/08/24
C:\>echo %dt:/= %
2011 08 24

バッチファイル用コマンド

echoバッチファイルの中のメッセージの表示、非表示
rem注釈行を設定する。
pauseバッチファイルの処理を一時停止させる。
if else条件によって処理を分岐する。
gotoバッチファイルの中の別の処理ブロックにジャンプする。
call現在のバッチファイルから他のバッチファイルを呼び出し移動させる。
forコマンドを繰り返して実行させる。
shiftバッチパラメータを繰り上げる。
setlocalバッチファイルでの環境変数の使用を開始する。
endlocalバッチファイルでの環境変数の使用を終了する。

コマンドライン引数

%0バッチファイル名
%1〜%91番目〜9番目の引数
%*すべての引数

修飾子

修飾子機能・用途
%~1全ての引用句(")を削除して%1を展開する。
%~f1%1を完全修飾パス名に展開する。
%~d1%1をドライブ名だけに展開する。
%~p1%1をパスだけに展開する。
%~n1%1をファイル名だけに展開する。
%~x1%1をファイル拡張子だけに展開する。
%~s1展開されたパスはMS-DOSの「8.3形式」でも短い名前だけを含む。
%~a1%1をファイル属性に展開する。
%~t1%1をファイルの日付・時刻に展開する。
%~z1%1をファイルのサイズに展開する。
%~$PATH:1PATH環境に指定されているディレクトリを検索し、最初に見つかった完全修飾名に%1を展開する。~環境変数名が定義されていない場合、また検索してもファイルが見つからなかった場合は、この修飾子を指定すると空の文字列に展開する。

コマンドライン引数のループ処理


@echo off

:loop

if "%~1" == "" goto end

echo %1

shift

goto loop

:end

pause

参考サイト

その他

バッチファイルへファイルをドラッグ&ドロップ


ファイル名がコマンドライン引数として渡される。
複数ファイルをまとめてドラッグした場合、その数だけ引数として渡される。

上述のコマンドラインループ処理で、全て処理できる。