お髭処blog

ドイツのものを中心としたボードゲーム・カードゲームのプレイ記録・感想を中心としたブログです。最新のドイツゲームから、紀元前から伝わるゲーム、旧西ドイツ製のレアゲーム、日本伝統の博打まで幅広くプレイしています。

コマンドプロンプトに sleep がないので

Windows XPコマンドプロンプトに sleep がないので、"sleep.exe" というものが世にあるのをしりつつ自分で書いてみた。
単位は秒。世にあるものよりも機能が少ない!
すいません、最初はググりました。でも、出てくるのが VBS で "Wscript.Sleep(Wscript.Arguments(0))" みたいな荒っぽいものばかりだったので、エラーチェックをそれなりに入れました。
今回 sleep が欲しいと思ったのは、Windows 起動時に、複数のサーバー等チェックのための BAT ファイルを動かしているため。起動時(厳密にはログオン時か)には重い処理がたくさん動くので、それらが完了してから動かしたかったのです。いや、時間差で起動すればいいんですけれどね、作りたかったのですよ。
さらに、その目的だと最初に VBS のインタプリタが動くのは目的に合っていなくない? という理由でC言語で書き直してみたり。ソースファイルの管理が面倒になる泥沼の道に踏み込みました。
まあ、そんな感じで。以下ソースプログラム。

'	vbssleep.vbs
'
'	2010/05/15 make
'


Option Explicit

If Wscript.Arguments.length <> 1 Then
Wscript.Echo("Usage: cscript //NoLogo vbssleep.vbs [Second] ")
Else
Dim n
n = Wscript.Arguments(0)
If IsNumeric(n) Then
Wscript.Sleep( n * 1000 )
Else
Wscript.Echo("Usage: cscript //NoLogo vbssleep.vbs [Second] ")
End If
End If
/*
sleepsec.c

2010/05/15 make
*/


#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>


void printUsage(void);


long main(int argc, char* argv[])
{
long wait;

if ( argc != 2 ) {
printUsage();
return -1;
}

wait = strtol(argv[1], NULL, 10);
if ( wait == 0 ) {
printUsage();
return -2;
}
else if (wait == LONG_MAX) {
fprintf(stderr, "Too Long Time.\n");
printUsage();
return -3;
}
else if (wait < 1 || wait == LONG_MIN) {
fprintf(stderr, "Too Minimal Time.\n");
printUsage();
return -4;
}

wait = atol(argv[1]) * 1000;
Sleep( wait );

return wait;
}


void printUsage(void) {
fprintf(stderr, "Usage: sleepsec [Second]\n");
}

追記
コンパイル済み実行ファイルを置きました。続・コマンドプロンプトに sleep がないので