【.cmd】 バッチファイルスクリプト %15 【.bat】 (819レス)
上下前次1-新
346: 2023/06/30(金)07:06 ID:y1MImIiE(1) AAS
誰かが勝手にタイムスタンプをいじったりしないって前提だけど
前回の最新タイムスタンプか、そのファイル名自体をどこかに保存しておいて
それより新しいファイルだったら処理
347: 2023/06/30(金)09:08 ID:pv7EwXK7(1/2) AAS
「追加されたファイル」ってなあに?
余所にあった古いファイルをコピーしたら
更新日時は古いままだけど
348(1): 2023/06/30(金)10:28 ID:u+TfOZmJ(1) AAS
実行済のファイルは別フォルダに移動が楽だろ
349(1): 2023/06/30(金)12:14 ID:0Iq5JqfB(2/2) AAS
>>348
ですよね。
このフォルダのファイルからデータ取ってる人もいて
調整が必要で
350: 2023/06/30(金)14:03 ID:pv7EwXK7(2/2) AAS
処理後にarchive属性をオフにしたら?
351: 2023/06/30(金)15:56 ID:YeFfrwhl(1) AAS
現れたなら聞かれた質問にくらい答えろよ
352: 2023/07/01(土)00:26 ID:xI+Y6sFQ(1) AAS
>>349
後だし情報
353: 2023/07/01(土)05:09 ID:nMEzWNF9(1) AAS
タイムスタンプを記録しておく
初回は1970年以後で、年月日時分秒_1 以前のファイルを処理する。
次回は年月日時分秒_1 以後で、年月日時分秒_2 以前のファイルを処理する
354: 2023/07/01(土)09:52 ID:UDkRE5jB(1) AAS
追加ファイルの性質でアトリブートもタイムスタンプも使えるかどうかわからん
質問してる人がいるが回答が無いので
355: 2023/07/04(火)17:06 ID:LIey+Zab(1/5) AAS
作ってみました。行数ギリギリです。
356: 2023/07/04(火)17:08 ID:LIey+Zab(2/5) AAS
@echo off
setlocal enabledelayedexpansion
set update=update.txt
set temp=temp.txt
set ignore=%update% %temp% %~nx0
set /A num=last=0
if exist %update% (
sort /R %update% > %temp%
set /P line=< %temp%
echo 前回更新日時 !line!
if "!line:~,16!"=="%date% %time:~0,5%" (
echo 更新が早すぎます しばらくお待ちください
:loop
if "!line:~11,5!"=="%time:~,5%" goto loop
)
set last=!line:~0,4!!line:~5,2!!line:~8,2!!line:~11,2!.!line:~14,2!
) else echo 初回更新です
dir /A-D /OD | findstr /R "^20[0-9][0-9]" | findstr /V "%ignore%" > %temp%
for /F "delims=" %%f in (%temp%) do (
set line=%%f
set ftime=!line:~0,4!!line:~5,2!!line:~8,2!!line:~12,2!.!line:~15,2!
if !last! lss !ftime! (
set fname=!line:~36!
echo [処理中] !fname! (処理をこの後に入れる)
set /A num+=1
))
if !num! equ 0 (
echo 更新ファイルはありません
) else (
echo %date% %time:~0,5% >> %update%
echo !num! のファイルを更新し %update% に更新日時を追記しました
)
357: 2023/07/04(火)17:38 ID:LIey+Zab(3/5) AAS
ファイルのタイムスタンプが前回更新日時より後かどうかのみ見ています。
もしも、分まで同じであれば更新しません。
前回更新日時と現在日時が分まで同じなら、1分進むまで待ちます。
なんとなく、同じ日時が更新記録に残るというのが気持ち悪いからです。
358: 2023/07/04(火)20:16 ID:dJR+6uCy(1) AAS
お疲れ
359: 2023/07/04(火)21:21 ID:+24T6cXg(1/2) AAS
ファイルの取り扱いにもよるけど
タイムスタンプでの管理はあまりよくないと思う
俺は結構ちょこちょこいじっちゃうのでタイムスタンプでは新旧の区別がつかなくなることが多い
360: 2023/07/04(火)21:30 ID:+24T6cXg(2/2) AAS
あとtmp,temp環境変数の書き換え
とくにフォルダとして使ってるものをファイル名にするのは危険
cmdの世界ではtmpがダメだがtempも使わないほうが良い
361: 2023/07/04(火)21:31 ID:9emtMuJF(1) AAS
リーズナブルな実装とは何だったのか
362: 2023/07/04(火)23:34 ID:LIey+Zab(4/5) AAS
temp の件は setlocal を使っているとはいえ、確かにタブーみたいなので変更しました。
タイムスタンプの件は、後でいじったファイルに対して再度作業を実行するかどうかの問題ですね。
そこら辺は、質問者が条件を書いてないので不明ですが、私はいじったファイルについても再度実行
するんじゃないかなと思ったので(それに簡単なので)そうしました。
1度実行したファイルには2度と実行しないのなら、終わったファイルはリネーム(例えば頭に _ を付加)
するとかして除外するか、終わったファイルリストを書き出してそれをチェックするとかですかね。
他のフォルダへ移動するのが最もいいと思うけど、なんだか都合が悪いみたいなので。
363: 2023/07/04(火)23:36 ID:LIey+Zab(5/5) AAS
@echo off
setlocal enabledelayedexpansion
set update=update.txt
set ichiji=temp.txt
set ignore=%update% %ichiji% %~nx0
set /A num=last=0
if exist %update% (
sort /R %update% > %ichiji%
set /P line=< %ichiji%
echo 前回更新日時 !line!
set last=!line:~,4!!line:~5,2!!line:~8,2!!line:~11,2!.!line:~14,2!
if "!line:~,16!"=="!date! !time:~,5!" (
set /A sec=160-1!time:~6,2!
echo 更新が早すぎます !sec! 秒お待ちください
:loop
if "!line:~11,5!"=="!time:~,5!" goto loop
)
) else echo 初回更新です
dir /A-D /OD | findstr /R "^20[0-9][0-9]" | findstr /V "%ignore%" > %ichiji%
for /F "delims=" %%f in (%ichiji%) do (
set line=%%f
set fname=!line:~36!
set ftime=!line:~,4!!line:~5,2!!line:~8,2!!line:~12,2!.!line:~15,2!
if !last! lss !ftime! (
echo [処理中] !fname! (処理をこの後に入れる)
set /A num+=1
)
)
if !num! neq 0 (
echo %date% %time:~0,5% >> %update%
echo !num! のファイルを更新し %update% に更新日時を追記しました
) else echo 更新ファイルはありません
364: 2023/07/05(水)06:45 ID:Ig34wRo0(1/3) AAS
time /t だと 06:00 なのに echo %time% だと 6:00:00.00 になる。
なんで、%time% だと頭の 0 がスペースになるんだよ。
おかげで余計なバグができちゃったじゃないか。
というわけで、バグ取りました。って誰も見てないか・・・。
365: 2023/07/05(水)06:55 ID:Ig34wRo0(2/3) AAS
@echo off
setlocal enabledelayedexpansion
set dispskip=0
set update=update.txt
set ichiji=temp.txt
set ignore=%update% %ichiji% %~nx0
set /A num=last=0
if exist %update% (
sort /R %update% > %ichiji%
set /P line=< %ichiji%
echo 前回更新日時 !line!
set /A sec=160-1!time:~6,2!
if "!line:~,16!"=="!date! !time:~,5!" if sec gtr 2 echo 更新が早すぎます !sec! 秒お待ちください
:loop
if "!line:~11,5!"=="!time:~,5!" goto loop
set last=!line:~,4!!line:~5,2!!line:~8,2!.!line:~11,2!!line:~14,2!
if "!last:~9,1!"==" " set last=!last:~,9!0!last:~10!
) else echo 初回更新です
dir /A-D /OD | findstr /R "^20[0-9][0-9]" | findstr /V "%ignore%" > %ichiji%
for /F "delims=" %%f in (%ichiji%) do (
set line=%%f
set fname=!line:~36!
set ftime=!line:~,4!!line:~5,2!!line:~8,2!.!line:~12,2!!line:~15,2!
if !last! lss !ftime! (
echo [処理中] !fname! (処理をこの後に入れる)
set /A num+=1
) else if %dispskip% neq 0 echo スキップ !fname!
)
if !num! neq 0 (
echo !date! !time:~,5! >> %update%
echo !num! のファイルを更新し %update% に更新日時を追記しました
) else echo 更新ファイルはありません
366: 2023/07/05(水)12:49 ID:Ig34wRo0(3/3) AAS
よく見ると ! ではさむのを忘れとるじゃないか。
if "!line:~,16!"=="!date! !time:~,5!" if sec gtr 2 echo 更新が早すぎます !sec! 秒お待ちください
これは正しくはこうですね。(2秒以下の場合でも表示されていただけ)
if "!line:~,16!"=="!date! !time:~,5!" if !sec! gtr 2 echo 更新が早すぎます !sec! 秒お待ちください
367(1): 2023/07/05(水)12:59 ID:jlkBTxWV(1) AAS
powershellで書いたら1~数行だね
ふぅ
368: 2023/07/05(水)13:43 ID:hRO8F47X(1) AAS
数行なら書いて差し上げたら
もう見ていないかも知れないけど
369: 2023/07/05(水)18:25 ID:4rZ7+jZr(1) AAS
>>367
スレ違いとかいわないから後学のために記載して
370: 2023/07/05(水)23:14 ID:TBtlNfRd(1) AAS
バッチファイル不具合あるあるの日付またぎの対処が見当たらないな
やり直し
371: 2023/07/06(木)00:41 ID:X7484ET/(1/10) AAS
あぁ、もしかして、あれか、最後に update.txt に日付と時刻を追記する部分で、日付を取得した後、
時刻を取得する際に翌日になっているというまさに奇跡のタイミングのことを言ってるのか?
そんな時間にバッチを動かすとも思えんし、実際にその状態を発生させようと思っても起こらないだろう。
そのような超レアケースに無駄に頭と行を使うのはアホらしいが、まぁ、やってやるよ。
set date0=!date!
set time0=!time!
if not !date0!==!date! if !time0:,2! equ 0 set date0=!date!
echo !date0! !time0:~,5! >> %update%
はい、アップデート完了!
372: 2023/07/06(木)00:44 ID:X7484ET/(2/10) AAS
ごめん、~ が抜けてた。
set date0=!date!
set time0=!time!
if not !date0!==!date! if !time0:~,2! equ 0 set date0=!date!
echo !date0! !time0:~,5! >> %update%
373: 2023/07/06(木)00:50 ID:X7484ET/(3/10) AAS
まぁ、実際はその if 以下へたどりつくことは決してないだろうから、間違えていても同じかもな。
374: 2023/07/06(木)00:56 ID:X7484ET/(4/10) AAS
よく考えたらこれでも同じか。
set date0=!date!
set time0=!time!
if !time0:~,2! equ 0 set date0=!date!
echo !date0! !time0:~,5! >> %update%
375: 2023/07/06(木)07:56 ID:kQU1BcI/(1) AAS
考慮不要なレアケースではない。
例えば自ホストの時計がジョブスケジューラサーバ等の時計より少し遅れていると発生する。
「サンプルコードだから入れてない」なら分かる。
上下前次1-新書関写板覧索設栞歴
あと 444 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.020s