[前の記事]« SORTの対象桁位置を限定したい
[次の記事]バッチファイルからの剰余の計算がうまく行かない »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「DATE,TIME…日付、時刻の取得/利用」索引へ
▲カテゴリー「FOR .. IN ( ) DO..」索引へ
▲カテゴリー「遅延環境変数の展開」索引へ

ファイルの更新日付の取得について

1304.
ファイルの更新日付の取得について
2006年07月26日(水) 09時28分
ken
以前質問させていただいたkenと申します。
●DOS/Windowsのバージョン
 MS Windows XP + SP2

●質問
 あるファイルの更新日付を取得して、変数に
 セットする方法を教えて下さい。
 例、c:\test.txt の更新日付を変数にセットする。
 
FOR /F "tokens=1* delims=, " %%i in ('dir c:\test.txt') do 変数1=%%i
 とやってみたのですが、オプションなしでdir 
  を実行しているため、見出し/要約の部分(0 個のディレクトリ  97,215,619,072 バイトの空き領域)
 がセットされてしまいます。
 次に見出し/要約を表示させないために /B オプション
 を付けて dir を実行させたのですが、今度は
 日付の部分まで表示されなくなってしまいました(ファイル名のみ)。
 過去の掲示板も調べたのですが(1週間更新ないファイルの削除など)、 更新日付の値自体を取得して比較
 などはしていないようでした(今回は更新日付の
 値が欲しいです)。
 もしよい方法がございましたら、教えて下さい。
1305.
Re:ファイルの更新日付の取得について
2006年07月26日(水) 13時00分
じゃく
>以前質問させていただいたkenと申します。
>●DOS/Windowsのバージョン
> MS Windows XP + SP2
>
>●質問
> あるファイルの更新日付を取得して、変数に
> セットする方法を教えて下さい。
> 例、c:\test.txt の更新日付を変数にセットする。

こんにちは。
FOR 変数参照の置換の拡張修飾子 ~t を使う例です。

for %%a in ( c:\test.txt ) do set fdate=%%~ta
set fdate=%fdate:~0,10%
echo %fdate%

1306.
Re:ファイルの更新日付の取得について
2006年07月26日(水) 13時33分
ken
じゃくさん、ありがとうございます。
連絡いただいた方法でうまく行きました。

%~ta は、FORでファイルの日付/時刻に展開するオプション
ですね。
ヘルプで見つけていたのですが、うまく使えません
でした。
しょうが無いので、FORのなかで"個のファイル"
と言うキーワードがきたらgotoでFORを抜けようと
していました。

よい方法をありがとうございました(とても助かりました)。
1315.
Re:ファイルの更新日付の取得について
2006年07月27日(木) 18時06分
ken
ファイルの更新日付を取得する件です。
じゃくさんから回答いただいた方法をFORの中に記述
すると動作が不安定になります。
現状、FORを入れ子にせず(同じ処理を複数回書いている)、
対応しているので、問題はないのですが、原因が
理解できず気になります。
もし原因がお分かりでしたら、教えていただけ
ませんでしょうか。
※ FORの中にECHOなどを入れて調べましたが、
  遅延展開は関係なさそうでした。

再現例
●正しく動作するケース
 for %%a in ( c:\test.txt ) do set fdate=%%~ta
 echo %fdate%
 ※ FORを入れ子にしないと正常に動作します。

●動作が不安定な(FORを入れ子にした場合)ケース
 SET DriveList=C: E:
 FOR %%I in ( %DriveList% ) do (
    for %%a in ( c:\test.txt ) do set fdate=%%~ta
    echo %fdate%
 )

●動作が不安定な実行例(上のソースをtest.batとして保存)
c:\>test.bat
2006/07/27 17:00
2006/07/27 17:00

c:\>del c:\test.txt

c:\>test.bat
2006/07/27 17:56
2006/07/27 17:56
※ 内側のFORで読み込むファイルを削除しても、
  前の情報が表示されてしまいます。

以上、よろしくお願いいたします。
1318.
Re:ファイルの更新日付の取得について
2006年07月27日(木) 21時53分
otn
まさに、遅延展開が必要な典型例です。

> SET DriveList=C: E:
> FOR %%I in ( %DriveList% ) do (
>    for %%a in ( c:\test.txt ) do set fdate=%%~ta
>    echo %fdate%
> )

%DriveList% および %fdate% の展開は外側のforの実行開始時に行われます。
内側のfor do のところで、fdateに値をセットしていますが、それは echo %fdate% には影響しません。

値を確認するだけなら、
SET DriveList=C: E:
FOR %%I in ( %DriveList% ) do (
   for %%a in ( c:\test.txt ) do set fdate=%%~ta
   set fdate
)
値を何かに使いたいなら、遅延展開を使って、
setlocal enabledelayedexpansion
SET DriveList=C: E:
FOR %%I in ( %DriveList% ) do (
   for %%a in ( c:\test.txt ) do set fdate=%%~ta
   echo !fdate!>>file.txt
)
もしくはサブルーチンを使って、
SET DriveList=C: E:
FOR %%I in ( %DriveList% ) do (
   for %%a in ( c:\test.txt ) do set fdate=%%~ta
   call :sub
)
goto :eof
:sub
   echo %fdate%>>file.txt
goto :eof
1319.
Re:ファイルの更新日付の取得について
2006年07月28日(金) 08時39分
ken
otn さん、いつもありがとうございます。
どちらの方法でもうまく行くことを確認できました。
どうにか自力でやろうとして、遅延展開が原因でないか
と言うところまで思いついたのですが、その中での
記述方法が間違ってうまく行っていませんでした(otn
さんの例を見てわかりました)。

また、サブルーチンの方法で一つ疑問があります。
サブルーチンが呼ばれて、
:sub
   echo %fdate%>>file.txt
goto :eof
のところで、goto :eof と言うので、バッチが終了して
しまうような気がします(call に戻らず、処理がC:の1回しか実行されない)。
しかし実際に試して見ると、きちんと call に戻って
処理を複数回(この例だと C: と E: の2回)実行
されています。
:sub の中での goto :eof はサブルーチンを終了する
だけで、バッチがそこで終了してしまうわけではない
と言う理解で有っているでしょうか。

1320.
Re:ファイルの更新日付の取得について
2006年07月28日(金) 10時30分
じゃく
こんにちは。

単なる興味からの疑問なんですが、
> SET DriveList=C: E:
> FOR %%I in ( %DriveList% ) do (
>    for %%a in ( c:\test.txt ) do set fdate=%%~ta
>    echo %fdate%
> )
このように2重のループにするのは何のため何でしょう?
DriveList で2回ループしますが、ループの中では毎回 C:\test.txt のタイムスタンプを取得しますから、同じ結果にしかなりそうにないのですが。


>サブルーチンが呼ばれて、
>:sub
>   echo %fdate%>>file.txt
>goto :eof
>のところで、goto :eof と言うので、バッチが終了して
>しまうような気がします(call に戻らず、処理がC:の1回しか実行されない)。
>しかし実際に試して見ると、きちんと call に戻って
>処理を複数回(この例だと C: と E: の2回)実行
>されています。

call /? に説明がありますよ。

    CALL :ラベル 引数

指定された引数で新しいバッチ ファイル コンテキストが作成され、指定
されたラベルの次の文に制御が渡されます。バッチ スクリプト ファイルの
最後に 2 回到達することによって、2 回 "終了" する必要があります。
1 回目に最後に到達したときには、制御は CALL 文の次の行に返されます。
2 回目に、バッチ スクリプトが終了します。バッチ スクリプトから "戻る"
ための GOTO :EOF 拡張機能の説明については、GOTO /? と入力してください。

1321.
Re:ファイルの更新日付の取得について
2006年07月28日(金) 11時03分
otn
otnです。

>単なる興味からの疑問なんですが、
>このように2重のループにするのは何のため何でしょう?

おそらく、現象が発生する最小限のコードということでしょう。長々と元のコードを書かれるより回答が書きやすいです。

>>goto :eof
>>のところで、goto :eof と言うので、バッチが終了して
>>しまうような気がします(call に戻らず、処理がC:の1回しか実行されない)。

>call /? に説明がありますよ。

逆に、サブルーチンの中でスクリプトを終了させたいことがたまにあるんですが、これができない(C だと exit(1);)。

exit /b だと goto :eof と同じ動きだし、exit にするとコマンドプロンプトごと終了しちゃいます。
1322.
Re:ファイルの更新日付の取得について
2006年07月28日(金) 15時01分
ken
じゃくさん、otnさんご連絡ありがとうございます。

ループをネストしている理由は、otnさんのご指摘
通り、ほぼ同じ内容の処理を何度も繰り返しているため
です。
また、goto :eofとサブルーチンについてもよくわかりました。
いつもありがとうございます。
 
 


カテゴリー「DATE,TIME…日付、時刻の取得/利用」索引へ
カテゴリー「FOR .. IN ( ) DO..」索引へ
カテゴリー「遅延環境変数の展開」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2006年07月26日 02:09に投稿されたエントリーのページです。

ひとつ前の投稿は「SORTの対象桁位置を限定したい」です。

次の投稿は「バッチファイルからの剰余の計算がうまく行かない」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
 
このブログについて | 運営:有限会社メディアポート