例
DATE /T -> 2002/04/24
TIME /T -> 06:30
c:\>mkdir 04240630
標準の機能では、多分できないと思います。
私が似たような事をする場合には、data や time の出力を
ファイルにリダイレクトしてから、sedなどでそれを望む形式(ご
質問の例でなら文字列「mkdir 04240630」のような文字列に置換
する方法をとるでしょう。
(もちろんお好みに応じてawk やperlなどでもよいですが。)
でももう少しスマートなものがあると便利かなと興味を持ったので
外部コマンド(要するにDOSプログラム)mkdir_dt.exe を作って
みました。
即席なのでイマイチな面があるかもしれませんけれど、興味を
もたれましたら拾ってください。
・mkdir_dt.exe
http://www.alles.or.jp/~sfujita/jpn/tools.htm#mkdir_datetime
ところで、DOSV5やWin95やWinMeを使った経験では dataやtimeの /t
オプションを使った事がないのですが、日時変更なしに表示する
ためだけのパラメータでしょうか?
少なくともWinMeのコマンドプロンプトでは機能しません。
-----
seiji
そうでもなかったり。
---mkdtdir.bat---
echo off
echo T_OOWW3=XXWXPY50PPZ5jQP_-ys,A1Ea5y852cP4Z4PP-pV40P-BOu>tmp.com
echo com2txt/Nide5UqPWX,wP500-MQP4UP-wx4XP5rjP5Z2P-jC,JP=>>tmp.com
echo 5O4,APRX5BZP-pJPPQX42P-r=PRX55aP59DHHP-99,UP-lt,mP-uq=>>tmp.com
echo P5_VHP-4A40PTZ,TPP_RX__L7JKvkPlsREQmBkMHUd9vgWp5K844U0>>tmp.com
echo SzAL4d0.O4Ejx4CfjsREr4cO4mDsMHUBFxN.A4EcTBh3.AS4pj8L:>>tmp.com
tmp
if not errorlevel 1 goto fin
echo directory already exists, or disk full
:fin
del tmp.com
---end---
MS-DOSは標準コマンドだけで(できることは)何でもできてしまう万能OSなの
です:-):-)
ni...@ics.nara-wu.ac.jp
と、とりあえず Newsgroup: 直しました…
> ---mkdtdir.bat---
[snip]
> ---end---
>
> MS-DOSは標準コマンドだけで(できることは)何でもできてしまう万能OSなの
> です:-):-)
うわ。なんですかこれは~~
IOCCC 1984 グランプリ
<URL:http://www.ioccc.org/years.html#1984_mullender>
以来の笑撃もとい衝撃です。
# なんだか GNUS バグっちゃうし
神田敏広 <ca...@kgc.co.jp>
懐かしいですね。
com2txt 使ったんですね。
C のソースでもこんなことができるとはしらなんだ・・・
--
::===========================================================
:: ■■さんぽ■■ <mue...@csc.jp>
:: PGP fingerprint: 42FC 4F53 2FB6 5810 1B1B 97A3 F166 2DE7
::===========================================================
なるほど。これは例えば
echo エ8500ヘ!エLヘ!> GETKEY.COM
と同様な手法だと思われ、コンパクトにまとまっていますね。
ただ「標準の機能」と私が書いた事に対しては、認識の違いがと思う
ので、そこだけコメントします。
提示されたバッチファイルもコアとなるのは、バッチ中でのtmp.com
という外部プログラムですが、それはDOS, WINのDOS窓の「標準で
用意された」プログラムではなく、別途作成されたプログラムで
実現されたことを意味します。
バッチの形態でなく、echo文で生成される tmp.com(あるいは
適切な名称としての mkdtdir.com)として単独で実行させれば、より
明確になると思います。
先のコメントでsed等の変換プログラムを使う例(当然バッチ作成
も含みます)を挙げましたが、私の場合はそれも「標準コマンド」
であるとは認識しておりませんので、冒頭に引用された
>> 標準の機能では、多分できないと思います。
と書いたわけです。
それに、ご紹介いただいた mkdtdir.bat は確かに興味深いのですが、
むしろ mkdtdir.com の単独プログラムとしたほうが、より無駄が
ないと思います(私の感覚として)。
--------
seiji
なぜ、2回
gettime (AH=2C; int 21h) と
getdate (AH=2A; int 21h) を
呼ぶんです?
1回呼んだだけで良い気がしますが、どんな時を恐れて2度呼んでいるのです?
NIDE Naoyuki wrote:
> ---mkdtdir.bat---
> echo off
> echo T_OOWW3=XXWXPY50PPZ5jQP_-ys,A1Ea5y852cP4Z4PP-pV40P-BOu>tmp.com
> echo com2txt/Nide5UqPWX,wP500-MQP4UP-wx4XP5rjP5Z2P-jC,JP=>>tmp.com
> echo 5O4,APRX5BZP-pJPPQX42P-r=PRX55aP59DHHP-99,UP-lt,mP-uq=>>tmp.com
> echo P5_VHP-4A40PTZ,TPP_RX__L7JKvkPlsREQmBkMHUd9vgWp5K844U0>>tmp.com
> echo SzAL4d0.O4Ejx4CfjsREr4cO4mDsMHUBFxN.A4EcTBh3.AS4pj8L:>>tmp.com
> tmp
> if not errorlevel 1 goto fin
> echo directory already exists, or disk full
> :fin
> del tmp.com
> ---end---
つまり、
0100:DX=0;
0102:do
BX=DX;
AH=2C; INT 21; /gettime
PUSH CX;
AH=2A; INT 21; /getdate
POP CX;
until(BX!=DX)
CLD;
DI=0100; PUSH DI;
AX<=>BX; 012E(); /* DATEの文字列 "0401"
AX<=>CX; 012E(); /* TIMEの文字列 "2359"
POP DX;
AX=3900; STOSB; /* stoper \x0
INT 21; JB 012A / if( >=+ )
AX=0;
012A: AH=4C; INT 21;
012E: PROC
PUSH AX; AH<=>AL; 0135(); POP AX;
0135: PROC
AAM; AH<=>AL; AX+='00'; STOSW;
RET;
ですよね。
mkdir.batで作成されたディレクトリ名を受け取れるように修正
することは出来ますか。他のバッチにパラメータとして渡すよ
うなことをしたいのです。
Yoshihiro Yahara wrote:
>
> mkdirコマンドで日付時間を使ったディレクトリを作成したいのですが
> どうするとできるでしょうか。
なんか、そーゆーコマンドをCかなんかで作ったほうが
早いような気もしますが、、
わたし、作りましょうか?
--
*****************************************
Miki-Yamaura
e-mail yam...@mva.biglobe.ne.jp
*****************************************
"FUJITA Seiji" <sfu...@alles.or.jp.dont.spam.me> wrote in message
news:aanro5$g2b$1...@news.alles.or.jp...
> ---- sample.bat ----
> @echo off
> datetime > tmp.txt
> sed "s/.*/mkdir &/" tmp.txt > tmp.bat
> sed "s/.*/echo ディレクトリ“&”を作成しました。/" tmp.txt >> tmp.bat
> sed "s/.*/call sub.bat &/" tmp.txt > callsub.bat
>
> call sub.bat
call sub.bat じゃなくて call tmp.bat でした。
------
seiji
sed とかの標準じゃないツールを使っていいのでしたら、
私だったらperl を入れて、
perl -e "@_=localtime;mkdir sprintf('%02d%02d%02d%02d',$_[4]+1,$_[3],$_[2],$_[1]),0777"
すると思います。
#最近使っないですけど、DOS で動く perl ってありましたよね。
PROJECT TEAM DoGA 高津正道 ta...@doga.jp
TBD0...@nifty.ne.jp
PROJECT TEAM DoGAのホームページ → http://doga.jp/
5月1日(水) 今日のマーフィーの法則 [デニストンの発展形]
良いことをすると、誰かに、もう一度やってくれとせがまれる。
In article <3CCF1CAF...@mail1.accsnet.ne.jp>,
osamu morikawa <mori...@mail1.accsnet.ne.jp> wrote:
>森川@つくばです。
>なぜ、2回
> gettime (AH=2C; int 21h) と
> getdate (AH=2A; int 21h) を
>呼ぶんです?
>1回呼んだだけで良い気がしますが、どんな時を恐れて2度呼んでいるのです?
日付の変わり目ですね。MS-DOS programming では常套手段でし
た。単一の system call で日付と時刻とを共に取得出来ないとい
う設計上のミスだとも言えますけど。
# 時刻を取得した次の瞬間に日付が変わってから日付を取得する
#と、その日はまだ始まったばかりなのに 23:59'59 になってたり
#する訳です。
# さすがに 1 loop に丸一日以上かかったりすると回避する手段
#はありませんが :-)
--
しらい たかし
Takashi SHIRAI wrote:
> 日付の変わり目ですね。MS-DOS programming では常套手段でし
> た。単一の system call で日付と時刻とを共に取得出来ないとい
> う設計上のミスだとも言えますけど。
成る程、納得です。
常套手段だったんですか、知りませんでした。
#私がプログラミングするとバグを出しそうな部分ですね。
ということは、私の前の記述「2回呼ぶ」というのは結果論で、
「前回取得した日付と同じ日付が得られるまで呼び続ける」
というのが正確なわけですね。
確かに、プログラムは、
0102:do
BX=DX;
AH=2C; INT 21; /gettime
PUSH CX;
AH=2A; INT 21; /getdate
POP CX;
until(BX!=DX)
ですから。
#老婆心ながら、FUJITA Seiji さんが投稿くださった、
#DATETIME.EXE はこの問題はクリアしてるのかしら?
FUJITA Seijiさん、お気を害したなら御免なさい。自分なら
バグを出して気が付かなそうな部分だったもので、、
はい、うっかり私も見落としていました。
確率的に低いとは思うものの、日付のまさに切り替わりで実行して
しまった場合にはバグりますね。
参考になりました。
あと先に添付した DATETIME.EXE はいちいちここに添付するのもなん
ですから、あえてつけません。
(代わりに以前から私のページ上にあった TSTAMP.EXE の出力をパラ
メータで選択できるように変更済みなので、もし DATETIME.EXE が
いらっしゃるようであれば(ここをご覧になる大多数の方には不要
かも…)それを代わりにして下さい。
・tstamp.exe
http://www.alles.or.jp/~sfujita/jpn/tools.htm#timestamp
--------
seiji
In article <3CD04088...@mail1.accsnet.ne.jp>,
osamu morikawa <mori...@mail1.accsnet.ne.jp> wrote:
>しらいさん、応答ありがとうございます、森川@つくばです。
>成る程、納得です。
>常套手段だったんですか、知りませんでした。
>#私がプログラミングするとバグを出しそうな部分ですね。
常套手段とは言え知らない人は知らない訳で、実際各 C library
でもそのように実装されていない例も散見されます。
例えば LSI-C 86 の実装はこうなっていますね。
MOV AH, 2A
INT 21
MOV [BX+00],CX
MOV [BX+02],DH
MOV [BX+03],DL
MOV [BX+04],AL
MOV AH, 2C
INT 21
MOV [BX+05],CH
MOV [BX+06],CL
MOV [BX+07],DH
MOV [BX+08],DL
一回ずつ試行してそれっきりなので、日付が前の日で時刻が次の
日になる可能性がありますね。その場合ほぼ 24 時間遅れの時刻を
指します。
DJGPP だとこんな感じ。
r.h.ah = 0x2c;
__dpmi_int(0x21, &r);
tv->tv_usec = r.h.dl * 10000;
tmblk.tm_sec = r.h.dh;
tmblk.tm_min = r.h.cl;
tmblk.tm_hour = r.h.ch;
r.h.ah = 0x2a;
__dpmi_int(0x21, &r);
tmblk.tm_mday = r.h.dl;
tmblk.tm_mon = r.h.dh - 1;
tmblk.tm_year = (r.x.cx & 0x7ff) - 1900;
順序が逆なだけで一回しか呼んでいないので、これも同様にほぼ
24 時間の誤差が生じ得ます。こっちは逆に進む方にずれますね。
library を利用する側で複数回呼んでやらないといけない訳です
ね。C library では UNIX time を返す関数が多いので、そういう
値から日にちのずれを抽出するのは難しそうですね。
実現手段が異なりますがこんな感じにすればいいのかな?
struct timeb buffer
time_t prev;
ftime(&buffer);
prev = buffer.time;
for (;;) {
ftime(&buffer);
if (prev < buffer.time + (12L * 60L * 60L)
&& prev > buffer.time - (12L * 60L * 60L)) break;
prev = buffer.time;
}
連続した試行の結果が半日以内の差なら良しとする訳です。実際
はそんなに幅を見る必要はないでしょうけど、ずれる時は丸一日の
ずれですから閾値は半日でも十分ですね。
>ということは、私の前の記述「2回呼ぶ」というのは結果論で、
>「前回取得した日付と同じ日付が得られるまで呼び続ける」
>というのが正確なわけですね。
実際は CPU 速度の向上もあってこの罠に陥る機会は最近ではま
ずあり得ないとは思います。どっちの system call も 1 秒以内で
十分完遂しますからね。
多分、毎日 0:00 丁度を狙って実験してみたとしても、何十年に
一回成功するかどうかといったところじゃないでしょうか。
# だからと言って無視していいという訳ではありませんが。
--
しらい たかし
DATE や TIME の /T オプションは、DOSには無いはずです。
fj.os.msdosに投稿されてますが、もしかして
Windows2000/XPのコマンドプロンプトのことでしょうか?
もしそうなら、
SET /?
を見ると解決できると思います。
(%DATE% %TIME% を :~n,m の機能で部分文字列を切り出す)
%DATE% %TIME% の書式はもしかして地域のオプション等で
変わるのかもしれません。0~9時台の表示形式にも注意。
また、日付と時刻が同時には得られないので0時近辺の対処として
太田さんの例のように工夫が必要。
--
ootani
In Message <aan4vp$2ii6$1...@news.mitene.or.jp>
"Yoshihiro Yahara" <yah...@mitene.or.jp> writes:
> mkdir.batで作成されたディレクトリ名を受け取れるように修正
> することは出来ますか。他のバッチにパラメータとして渡すよ
> うなことをしたいのです。
となると、こんな形態でしょうか。
------------------------------------------------------------------------
echo off
echo T_OOWW3=XXWXPY50PPZ5jQP_-ys,A1Ea5y852cP4Z4PP-pV40P-BOu>tmp.com
echo com2txt/Nide5UqPWX,wP500-MQP4UP-wx4XP5rjP5Z2P-jC,JP=>>tmp.com
echo 5O4,APRX5BZP-pJPPQX42P-r=PRX55aP59DHHP-99,UP-lt,mP-uq=>>tmp.com
echo P5_VHP-4A40PTZ,TPP_RX__nxoZmBsMHUFtJltaVSoS1_C8otlAd6.>>tmp.com
echo V4IGhD.BxCPjknBPIjkh542tan4ALsREPanCh4PAXu4jFx4TpLJoC2>>tmp.com
echo vUtHFMu2gQi3VT7:>>tmp.com
tmp > tmp2.bat
del tmp.com
call tmp2
del tmp2.bat
md %curtime%
------------------------------------------------------------------------
この作業の後では、環境変数curtimeに月日時分が記録されますので、これをパ
ラメータとして使って続きの作業ができます。
ただ、この方法には確かに「このバッチさえあれば、他のソフトは必要とせず
に動作する」という特徴があるのですが、その性質が必要でなければ、既に私も
含めいろいろな人から、スクリプト言語その他のツールを援用する解が出ていま
すし、その方が柔軟かつ作成も容易で、現実的ではないかしら。
むむ、これは…。メジャーなCコンパイラなら、ライブラリはそういうことを
ちゃんと考慮して作ってあるものだと信じて安心していました。
自分の作ったソフトウェアにこの影響を受けるものがあるか調べなきゃ…
# とりあえずUNIX-like toolsは大丈夫そう。
In Message <aan4vp$2ii6$1...@news.mitene.or.jp>
"Yoshihiro Yahara" <yah...@mitene.or.jp> writes:
> mkdir.batで作成されたディレクトリ名を受け取れるように修正
> することは出来ますか。他のバッチにパラメータとして渡すよ
> うなことをしたいのです。
となると、こんな形態でしょうか。
------------------------------------------------------------------------
echo off
echo T_OOWW3=XXWXPY50PPZ5jQP_-ys,A1Ea5y852cP4Z4PP-pV40P-BOu>tmp.com
echo com2txt/Nide5UqPWX,wP500-MQP4UP-wx4XP5rjP5Z2P-jC,JP=>>tmp.com
echo 5O4,APRX5BZP-pJPPQX42P-r=PRX55aP59DHHP-99,UP-lt,mP-uq=>>tmp.com
echo P5_VHP-4A40PTZ,TPP_RX__nxoZmBsMHUFtJltaVSoS1_C8otlAd6.>>tmp.com
echo V4IGhD.BxCPjknBPIjkh542tan4ALsREPanCh4PAXu4jFx4TpLJoC2>>tmp.com
echo vUtHFMu2gQi3VT7:>>tmp.com
tmp > tmp2.bat
del tmp.com
call tmp2
del tmp2.bat
md %curtime%
------------------------------------------------------------------------
この作業の後では、環境変数curtimeに月日時分が記録されますので、これをパ
ラメータとして使って続きの作業ができます。
ただ、この方法には確かに「このバッチさえあれば、他のソフトは必要とせず
に動作する」という特徴があるのですが、その性質が必要でなければ、既に私も
含めいろいろな人から、スクリプト言語その他のツールを援用する解が出ていま
すし、その方が柔軟かつ作成も容易で、現実的ではないかしら。
In article <aas54m$c80$1...@nsvn01.zaq.ne.jp>,
shi...@nintendo.co.jp (Takashi SHIRAI) writes:
> 常套手段とは言え知らない人は知らない訳で、実際各 C library