*

Windowsバッチファイルの処理を一時停止させる sleep コマンド

公開日: : 最終更新日:2014/03/19 Windows

先日Windowsのバッチファイルを使っていて、不便だなと感じたことがありました。

ある実験をしていて、Windows PCから自動的に繰り返し繰り返し操作を加えていたのですが、ある操作と操作の間にポーズを挟む必要が生じました。しかもそのポーズ時間をミリ秒単位で変動させる必要がありました。

実験の自動化に普段はTeraTermマクロやらシェルスクリプト、expectやら駆使するのですが、そのときはどうしてもWindowsのバッチファイルしか使えない事情があって。

何年もWindowsを使っていながらそこで初めて気づいたのですが、Windows(Windows7)のバッチファイルでは、ミリ秒単位のポーズを挟む方法が標準では用意されていないのですね。

その時は時間も無かったので、急遽Windows Resource Kit Toolsを入手してその中に含まれるsleepコマンドを使いましたが、とっってもまどろっこしい思いをしました。

先日そんなことがあって、この週末はプライベートに少し余裕があったので、パパッと作ってみましたよ。お手製の Sleepコマンド!

パパッと作ったと言っても、Windowsの開発環境すら持っていなくて、Visual Studio Express 2013をインストールするところから始めたので、トータルの時間はかかりましたけどね。Visual Studio Express 2013インストール記は、また時間がとれたら書こうと思います。

ソースを公開しても、稚拙なコードで恥ずかしい以外の問題はたぶん無いと思うので、公開します。

お手製 sleepコマンドのバイナリはこちら
Visual Studio Express 2013 の Solutionファイルはこちら

バイナリの利用には
http://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs
から Visual C++ Redistributable for Visual Studio 2013のx86版をインストールする必要があります。

Cygwin入れるとか代替手段はいくらもありますが、もし同じことで困っている方がいらっしゃればお使いください。ただし万一損害が生じても一切責任はとれないのでご了承ください。また再配布はしないでください。

またCopyrightに関して一つ。sleep作るにあたって、Free Getoptというオープンソースソフトウェアを利用させていただきました。作者に感謝いたします。再配布条件にある各表示は、バイナリについてはアーカイブに同梱、ソースについてはソースファイルのヘッダーに表示してあります。

しかしこれも今回初めて気づいたのですが、Windowsの開発環境には getopt()が無い!?のですかね。これはもしかしたら私の探し方が悪いのかもしれませんが。不便だなーと思いました。

#include <iostream>
#include <windows.h>
#include "stdafx.h"
#include "getopt.h"

using namespace std;

#define MAX_SEC            4000000
#define MAX_MSEC        4000000000

/*
 *    Usage
 */
static void
usage(void)
{
    cout
        << "Usage : sleep [-m] DURATION" << endl
        << "  Sleep in specified seconds, "
        << "or milliseconds if '-m' option was specified." << endl;
}

/*
 *    コマンドライン引数の読み込み
 */
static int
parse_arg(int argc, char *argv[], unsigned long *dur)
{
    int opt;
    unsigned long msec = 0, sec = 0, max = MAX_SEC;
    unsigned long *psec = &sec;
    char *ep;

    /*
     *    オプション引数のparse
     */
    while ((opt = getopt(argc, argv, "m")) != -1) {
        switch (opt) {
        //milliseconds指定
        case 'm':
            psec = &msec;
            max = MAX_MSEC;
            break;

        //不正なオプションがあった
        case '?':
            return -1;

        default:
            break;
        }
    }

    /*
     *    DURATION引数のparse
     */
    if (optind >= argc) {
        cerr << "DURATION is required." << endl;
        return -1;
    }
    *psec = strtoul(argv[optind], &ep, 10);
    if (*ep != '\0') {
        cerr << "Invalid argument." << endl;
        return -1;
    }
    if (*psec == ULONG_MAX || *psec > max) {
        cerr << "DURATION must be less than " << dec << max << "." << endl;
        return -1;
    }
    *dur = sec * 1000 + msec;

    return 0;
}

/*
 *    メイン
 */
int
main(int argc, char *argv[])
{
    unsigned long dur = 0;

    if (argc == 1) {
        usage();
        return 0;
    }

    if (parse_arg(argc, argv, &dur) < 0)
        return -1;

    Sleep(dur);

    return 0;
}

関連記事

32installing_thumb.png

Hyper-VでUbuntu 14.04を試す(2)

前回の続きです。 作成した仮想マシンにUbuntu 14.04のサーバー版をインストールする

記事を読む

1front_thumb.jpg

限定版が復活してた。ASUS TransBook T100TA

今回は私が愛用している10.1インチWindowsタブレットの使用感です。 いわゆる”2

記事を読む

1enable_hyperV_thumb.png

Windows 8.1上でHyper-Vを試す ~Ubuntuの仮想マシンを作る(1)~

Linuxのカーネルソースをあれこれいじるにあたって、実験用のLinux環境が欲しくなり、新たにUb

記事を読む

36export_thumb.png

Hyper-VでUbuntu 14.04を試す(3)

前回、仮想マシンにUbuntu 14.04をインストールしました。 続いて環境整備。 まずはI

記事を読む

err_newMediaObject_thumb.png

metaWeblog.newMediaObject メソッドへの応答が無効です

ブログの執筆にWindows Live Writerを使っています。 この記事を投稿しよ

記事を読む

6memflush_thumb.png

Hyper-Vの動的メモリは本当に動的だった!?

前回、無用なトラブルを避けるつもりで無難な選択をした結果、却ってロクでもない目に遭ったようだという話

記事を読む

am1h-hyperV-perfmon-2_thumb.png

Hyper-V 対 VMware Player対決

先日、バーチャルマシン上でプログラムをビルドすると時間がかかってしようがない。ビルドするならやっぱネ

記事を読む

bash

Cygwin上でiperfをビルド

ネットワークの疎通確認に便利なツールiperf。 先日Windows上で使おうと思ったら、見つから

記事を読む

3delete_thumb.png

Hyper-V 上の Ubuntu で非レガシーなネットワークアダプターを使えた

以前 Hyper-V上にUbuntuの仮想マシンを作りましたが、ネットワークアダプターにはレガシ

記事を読む

25eth0_trouble

Windows 8.1上でHyper-Vを試す ~ネットワークがつながらない~

前回、Hyper-V上の仮想マシンにUbuntuをインストールしたところまで書きました。 インスト

記事を読む

junctioned_VideoLAN_thumb.png
WindowsタブレットのProgram FilesをSDHCへ逃す

ここ数ヶ月、比較的低価格なWindowsタブレットが相次いで発売されて

raised1
カーネルモジュールのビルド

前回、OOM Killerの発動を検知するテスト用のカーネルモジュール

raised1
OOM Killerの発動を検知したい

今回はプログラムの話。タイトル通り、LinuxのOOM Killerが

1cpu_thumb.jpg
さよならK6-Ⅲ

何か物悲しいタイトルですが、K6-Ⅲ搭載PCを廃棄しました。かつて色ん

25eth0_trouble_thumb.png
E: Internal Error, No file name for libssl1.0.0

Ubuntu 12.04機を(も)使っています。動かなくなると困る一台

→もっと見る

PAGE TOP ↑