DOSのメモ

DOSでちょっと困ったときのメモです。
ここでは使用方法のみを記述しています。詳しくはDOSのヘルプ(help コマンド)か他の文献を当たって下さい。

ループ処理

配列によるループ

forを使用する場合コマンドラインで直接実行する場合変数に%を1つだけ付けますがバッチファイルの場合%を2つ付けます。
コマンドラインから直接実行する場合

for %n in ( 1 3 5 7 9) do (コマンド %n)

バッチファイルの場合

set CMD=コマンド
for %%n in ( 1 3 5 7 9) do (
%CMD% %%n
)

ファイルによるループ

バッチファイルで実行する場合

set CMD=コマンド
set PATH=src
for %%f in ("%PATH%\*.c") do (
%CMD% %%f
)

ここで%%fの値はsrc\test.cというようにフォルダー名がついています。

再帰削除

ファイルの削除

フォルダー下の同じフィル名のファイルを削除します。
delコマンドのオプションを指定することで削除できます。

del /F /S /Q ファイル名
  /F            読み取り専用ファイルを強制的に削除します。
  /S            指定されたファイルをすべてのサブディレクトリから削除します。
  /Q            ワイルドカードを使用して一括削除するときに、確認のメッセージ
                を表示しません。(QUIET モード)

フォルダーの削除

フォルダー下の同じフォルダー名のフォルダーを削除します。
フォルダーの削除はremdirコマンドがdelコマンドのようにサブディレクトリーのフォルダーを削除できないので、forループを使用して削除します。以下の例では.svnというフォルダーを削除します。

for /R %d in (.svn) do rmdir /S /Q "%d"
  /S      指定されたディレクトリに加えて、そのディレクトリ内のすべての
          ディレクトリとファイルを削除します。ディレクトリ ツリーを削除
          するときに使用します。
  /Q      /S を指定してディレクトリ ツリーを削除するときに、確認の
          メッセージを表示しません。(QUIET モード)

ファイル名の取得

バッチファイルの中でファイル名などを取得する方法 ここで%0がバッチファイル名です。別の変数にファイル名をセットして同様の処理をすることができます。以下はC:\work\test.batをC:\work\で実行した場合です。

%0   : バッチファイル名(test.bat)
%~f0 : フルパスのファイル名(C:\work\test.bat)
%~d0 : 現在のドライブ名(C:)
%~p0 : 現在のドライブ名を除いたフォルダー名(\work\)
%~n0 : 拡張子を除いたファイル名(test)
%~x0 : 拡張子(.bat)
%~nx0: フォルダー名を除いたファイル名。上記nとxの複合。(test.bat)

特殊文字

%は特殊な文字なので、バッチ内でパラメータ等で使用する場合は「%%」とします。

処理後のファイル名の拡張子の変更

以下はsrcフォルダー下にある拡張子がcのファイルをlogフォルダー下に拡張子をlogに変更してコピーするバッチのサンプルです。
ここで注意か必要なのは、拡張子を除いたファイル名%%~nfの部分を使用する前に、 set filename=%%~nfというように変数に代入することができないことです。

@echo off
set DRIVE_PATH=%~d0
set CUR_PATH=%~p0
set CMD=copy
set SRC_PATH=%DRIVE_PATH%\%CUR_PATH%\src
set LOG_PATH=%DRIVE_PATH%\%CUR_PATH%\log
for %%f in ("%SRC_PATH%\*.c") do (
%CMD% %%f %LOG_PATH%\%%~nf.log
)

ファイルの結合

copy A+B C

但し、コピー後のファイルCが1バイト多くなります。つまりAが5バイトBが5バイトの場合Cは11バイトになります。
同じ拡張子のファイルを一度に一つのファイルに統合する場合は以下のようにします。この時統合するファイルの拡張子は別の拡張子にします。

copy *.csv abc.txt
 

最終更新のRSS
Last-modified: 2016-07-19 (火) 19:39:59 (2828d)