とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub

カテゴリ:コマンドプロンプト の記事一覧

バッチファイルでexeを連続実行する方法


バッチファイルでexeを連続起動


時代に逆行してる気がしますが
前回に引き続き、バッチファイルの話です。

バッチファイルで、何らかのアプリケーションを実行するとき
そのアプリケーションのパスを記載すれば実行できます。

今回は、notepadコマンド、つまりメモ帳をバババ!と開く
コマンドを作ってみました。

20140409_notepad01.png
こんな感じ。

echo メモ帳を3回起動します
notepad
echo 1回目起動!
notepad
echo 2回目起動!
notepad
echo 3回目起動!

途中途中でechoコマンドを使ってコマンドラインに出力します。

というわけで実行

20140409_notepad02.png

・・・1回目起動でとまりました。
Xを押してメモ帳を閉じます。

20140409_notepad03.png

2回目も同じです。

20140409_notepad04.png

20140409_notepad05.png

3回目も同じく、メモ帳が閉じるまで、次のコマンドが動きません。
続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

バッチファイルで作業フォルダを指定してexe実行

作業フォルダとはなにか


exeファイルを実行するとき、「作業フォルダ」というものがあります。
ショートカットを作って、プロパティを開いた時のコレです。

20140408_01work.png

この作業フォルダ、そのファイルを実行する時のルートとなるパスのことで、
例えば

D:\blog\test.bat
というバッチファイルを作って、そのバッチファイルの中で
D:\blog\test.txt を開きたいときは
「test.bat」と「test.txt」が同一フォルダに存在すれば
test.txt って書くだけで開くことができます。

20140408_02work.png

20140408_03work.png

20140408_04work.png

ほらね。

次に、このtest.batのショートカットを、デスクトップに作ってみます。

20140408_05work.png

で、実行

20140408_06work.png

問題なく起動できます。

では、test.batの、ショートカットのプロパティを見てみましょう。

続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

dirコマンドでよく使うパラメータ・オプションまとめ

dirでファイル一覧を取得したい


フォルダの中のファイル数やサイズを確認する時はプロパティを確認すればひと目で分かるのだけど、
ファイル名やフォルダ構成まで確かめようとすると簡単にはいかないし、漏れも出ます。

ファイル確認

プロパティ確認
これじゃあ詳細が分からん。
フォルダ1の中にはフォルダが2個あって、それぞれのフォルダの中にはファイルが2つあるのだよ・・・

・ルートフォルダ(調べている場所)
├/ファイル1
├/ファイル2
├■フォルダ1
 ├/ファイル3
 ├/ファイル4
 ├■フォルダ2
  ├/ファイル5
  └/ファイル6
 └■フォルダ3
  ├/ファイル7
  └/ファイル8
└■フォルダ4
 ├/ファイル9
 ├/ファイル10
 ├■フォルダ5
  ├/ファイル11
  └/ファイル12
 └■フォルダ6
  ├/ファイル13
  └/ファイル14


この構成を出したい。
そこで、コマンドプロンプトでdirコマンドを使ってフォルダやファイル数を出力して
Excelにまとめたりして確かめるのですが
「dir」と単純に打ち込んでもやっぱり簡単にはリスト出力してくれません。
D:\command_dir>dir
ドライブ D のボリューム ラベルは ボリューム です
ボリューム シリアル番号は 82E4-8442 です

D:\command_dir のディレクトリ

2013/08/03 22:27 <DIR> .
2013/08/03 22:27 <DIR> ..
2013/08/03 22:23 6 0001.txt
2013/08/03 22:23 6 0002.txt
2013/08/03 22:27 <DIR> フォルダ1
2013/08/03 22:28 <DIR> フォルダ2
2 個のファイル 12 バイト
4 個のディレクトリ 493,871,255,552 バイトの空き領域

ほらね。

求めてるのはこういう結果です。
D:\command_dir\0001.txt
D:\command_dir\0002.txt
D:\command_dir\フォルダ1\F1_FILE1.txt
D:\command_dir\フォルダ1\F1_FILE2.txt
D:\command_dir\フォルダ1\フォルダ1-1\F1F1_001.txt
D:\command_dir\フォルダ1\フォルダ1-1\F1F1_002.txt
D:\command_dir\フォルダ1\フォルダ1-2\F1F2_001.txt
D:\command_dir\フォルダ1\フォルダ1-2\F1F2_002.txt
D:\command_dir\フォルダ2\F2_FILE1.txt
D:\command_dir\フォルダ2\F2_FILE2.txt
D:\command_dir\フォルダ2\フォルダ2-1\F2F1_001.txt
D:\command_dir\フォルダ2\フォルダ2-1\F2F1_002.txt
D:\command_dir\フォルダ2\フォルダ2-2\F2F2_001.txt
D:\command_dir\フォルダ2\フォルダ2-2\F2F2_002.txt


dirコマンドのヘルプを表示させると、いつものごとく分かりにくい説明が出てきます。
D:\command_dir>dir /?
ディレクトリ中のファイルとサブディレクトリを一覧表示します。

DIR [ドライブ:][パス][ファイル名] [/A[[:]属性]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]ソート順]] [/P] [/Q] [/R] [/S] [/T[[:]タイムフィールド]] [/W] [/X] [/4]


[ドライブ:][パス][ファイル名]
一覧表示するドライブ、ディレクトリ、またはファイルを指定します。

/A 指定された属性のファイルを表示します。
属性 D ディレクトリ R 読み取り専用
H 隠しファイル A アーカイブ
S システム ファイル I 非インデックス対象ファイル
L 再解析ポイント - その属性以外
/B ファイル名のみを表示します (見出しや要約が付きません)。
/C ファイル サイズを桁区切り表示します。これは
既定の設定です。/-C とすると桁区切り表示されません。
/D /W と同じですが、ファイルを列で並べ替えた一覧を表示します。
/L 小文字で表示します。
/N ファイル名を右端に表示する一覧形式を使用します。
/O ファイルを並べ替えて表示します。
ソート順 N 名前順 (アルファベット) S サイズ順 (小さい方から)
E 拡張子順 (アルファベット) D 日時順 (古い方から)
G グループ (ディレクトリから) - 降順
続行するには何かキーを押してください . . .


・・・というわけで
dirコマンドの後ろにくっつけるパラメータ(オプション)
をまとめておきます。 続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

バッチファイルのif文やfor文で気をつけること

if文の中で変数の値が反映されない


バッチスクリプトでハマッた。
if文、for文の中で変数を操作する処理を書いても
予想した通りの結果になりません。

「遅延環境変数の展開」という機能を有効にする必要があるので
注意点をメモしておきます。

作ったバッチファイルは以下


変数[Delay]に1をセットして
if文の中で+1する。

結果は2となっているので
Delay is 1
Delay is 2
final:Delay is 2

が期待する動き。

でも結果は・・・・
Delay is 1
final:Delay is 2

if文の中で2になっているはずなのに判断されてないぞ!?

バッチファイルのif文for文の仕様


if文、for文の中に書いた処理は
「()を抜けてから」変数の値が反映されるようです。
バッチファイルにおいて、コマンドは1行ずつ処理するけど、
if文は括弧()を1行として解釈するみたい。

つまり、ifの中で変数を変更して、その結果を参照するような処理は
書いても無駄ってことだね。

でも、直感的に書きたいよね・・・

遅延環境変数の展開


というわけで直感的に書には、次の2つが必要です。

1.setlocalコマンドにオプション「enabledelayedexpansion」を付ける。
2.変数の展開は「%」ではなくて「!」で行なう。

修正したバッチファイル


結果は・・・・
Delay is 1
Delay is 2
final:Delay is 2

よかった・・・

この解決方法にたどり着くにはifじゃなくて
setlocalのヘルプにヒントが書いてある。


setlocal /?
バッチ ファイルで環境変更のローカル化を開始します。SETLOCAL を実行した後で
変更した環境設定は、そのバッチ ファイルだけで有効です。前の設定を復元するときは
ENDLOCAL を実行しなければなりません。バッチ スクリプトの終わりに達したとき、
暗示的な ENDLOCAL が、そのバッチ スクリプトによって発行されたすべての未完了の
SETLOCAL コマンドのために実行されます。

SETLOCAL

コマンド拡張機能を有効にすると、SETLOCAL は次のように変更されます:

SETLOCAL バッチ コマンドは、オプション引数を受け取ることができます:
ENABLEEXTENSIONS / DISABLEEXTENSIONS
は、コマンド処理機能を有効または無効にできます。これらの
引数は、CMD /E:ON または /E:OFF スイッチよりも優先されます。
詳細については、CMD /? を参照してください。
ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION
は、遅延環境変数の展開を有効または無効にできます。
これらの引数は、CMD /V:ON または /V:OFF スイッチよりも優先します。
詳細については、CMD /? を参照してください。
これらの変更は、SETLOCAL コマンドの実行前の設定にかかわらず、対応する
ENDLOCAL コマンドを実行するまで継続されます。

SETLOCAL コマンドに引数を指定すると、ERRORLEVEL の値が設定されます。


こんなんで分かるわけないです!

テーマ:プログラミング - ジャンル:コンピュータ

バッチファイルでファイル名に連番を付けてコピーする~実行解説

同じファイルに0埋めされた連番を付けてコピーしたい。


テストデータ作成しかり、月次のファイルの作成しかり。

そんなシチュエーションに遭遇した場合
手作業で頑張ってファイルを作るか
ご希望の機能を持つファイラやツールを探すかしないといけない。

ところが昔からあるWindowsの命令言語にはコマンドプロンプトというものがあって、
ものすごく標準装備なのに周りは誰も使ってない。
ちょっとぐらい使いこなせてもいいんじゃないでしょうか。

ということで使いこなせていないコマンドプロンプトを少し勉強しておこうと思い
メモしておきます。

今回やりたいことは以下のとおり

1.複製したいファイルを用意する。
2.用意したファイルに対して、希望した枚数を指定したファイル名に変更し、連番を付加してコピーする。

というわけで、できあがったbatファイルは次の通り。



実行結果は
batファイルと同じフォルダに存在するtxtファイルに
連番を付加してコピーしまくります。

実行後のフォルダ内はこんな感じ。

コピー実行

コピー元のtxtファイルが複数あれば、その分倍増するので
実行には注意して下さい。 続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

前のページ

FC2Ad