11 Feb 2015, 02:46

Java で windows のコマンドを実行してフォルダコピー

はじめに

前回の続き.

Java を利用した copy だと, フォルダをコピーすると, 中身をコピーしない.

xcopy を利用.

中身をコピーする方法もあるようだけれども, めんどくさいので, xcopy を利用することにする.

xcopy で ファイルですか, ディレクトリですかと質問されるので, echo F を 先頭につけたいところだが, この方法だと, うまくいかない.

ファイルならば, copy を利用する. フォルダならば, xcopy /i で OK.

Java で windows のコマンドを実行する

processBuilder ライブラリを利用する.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class XCopyOperator {
    public static void main (String args[]) throws IOException, InterruptedException {
        String source = "foo";
        String target = "bar";

        // Process Builder 生成
        // xcopy /e /i source target ディレクトリを再帰的にコピー
        ProcessBuilder pb = new ProcessBuilder ("xcopy", "/e", "/i", source, target);

        // 標準出力と標準エラーをマージする (Defualt false)
        pb.redirectErrorStream (true);

        // プロセス開始
        Process process = pb.start ();

        // プロセス完了待ち合わせ
        process.waitFor ();

        // 結果の出力
        InputStream is = process.getInputStream ();
        printInputStream (is);
    }

    public static void printInputStream (InputStream is) throws IOException {
        BufferedReader br = new BufferedReader (new InputStreamReader (is));
        try {
            for (;;) {
                String line = br.readLine ();
                if (line == null) break;
                System.out.println (line);
            }
        } finally {
            br.close ();
        }
    }
}

24 Nov 2014, 02:23

Ruby の win32ole で Windows GUI アプリのキー操作を自動化する

はじめに

Windows 上のアプリをキーボード操作で自動化したいと考えた.

Ruby の win32ole を利用すれば, 実現できそうなので, 調べた.

Win32ole とは

Windows 版の Ruby には, win32ole というライブラリがある.

これを利用すると, Ruby から Windows のいろいろなアプリを操作できる. (Excel,iExplore などなど…)

Windows アプリにキーを送ることができるので, キー操作で完結するアプリならば, 操作を自動化できる, というわけだ.

以前, Excel の操作で win32ole を利用した.以下, 過去記事参照.

今回は, キーボード操作関連の情報をまとめる.

WSHShell を操作

WSHShell とは, Windows のシェル. これを Ruby から制御する.手順は 2 つ.

  • あるウィンドウをアクティブにできる
  • アクティブなウィンドウにキーコードを送る

事前準備

<div class="outline-text-3" id="text-unnumbered-4">
  <p>
    以下の 2 行で, まずは wsh オブジェクト生成.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> require &#8216;win32ole&#8217;<br /> wsh = WIN32OLE.new (&#8216;Wscript.Shell&#8217;)<br /> [/sourcecode]
  </p>
</div>

プログラム起動

<div class="outline-text-3" id="text-unnumbered-5">
  <p>
    Run メソッドでプログラムを起動できる.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> wsh.Run (&#8216;notepad.exe&#8217;)<br /> [/sourcecode]
  </p>
</div>

ウィンドウをアクティブにする

<div class="outline-text-3" id="text-unnumbered-6">
  <p>
    AppActivate メソッドで ウィンドウをアクティブにできる.
  </p>

  <p>
    アプリのタイトルを指定する. 成功すると, ture が返る. 失敗すると, false が返る.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> wsh.AppActivate (&#8216;Title&#8217;)<br /> [/sourcecode]
  </p>
</div>

ウィンドウにキーコードを送る

<div class="outline-text-3" id="text-unnumbered-7">
  <p>
    SendKeys メソッドで ウィンドウにキーを送る.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> wsh.SendKeys (&#8216;A&#8217;)<br /> [/sourcecode]
  </p>

  <p>
    詳細な SendKey コードはここにある.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://msdn.microsoft.com/en-us/library/8c6yea83.aspx">SendKeys Method</a>
    </li>
  </ul>
</div>

Sample

notepad

<div class="outline-text-3" id="text-unnumbered-9">
  <p>
    メモ帳起動してなにか書く. Popup メソッドでメッセージ表示.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> require &#8216;win32ole&#8217;
  </p>

  <p>
    wsh = WIN32OLE.new (&#8216;Wscript.Shell&#8217;)<br /> wsh.Run (&#8216;notepad.exe&#8217;)<br /> wsh.AppActivate (&#8216;無題&#8217;)
  </p>

  <p>
    wsh.SendKeys (&#8216;Hello&#8217;)
  </p>

  <p>
    wsh.Popup (&#8216;Happy Hacking!!&#8217;)<br /> [/sourcecode]
  </p>
</div>

explorer

<div class="outline-text-3" id="text-unnumbered-10">
  <p>
    C:-neraフォルダをコピーして test2 フォルダを作成する.
  </p>

  <p>
    [sourcecode language=&#8221;ruby&#8221; title=&#8221;&#8221; ]<br /> # coding: utf-8<br /> require &#8216;win32ole&#8217;
  </p>

  <p>
    wsh = WIN32OLE.new (&#8216;Wscript.Shell&#8217;)<br /> wsh.Run &#8216;explorer C:\Users\tsu-nera\Desktop&#8217;
  </p>

  <p>
    sleep (3)
  </p>

  <p>
    wsh.AppActivate (&#8216;Desktop&#8217;)
  </p>

  <p>
    # テストフォルダ選択<br /> wsh.SendKeys (&#8216;t&#8217;)
  </p>

  <p>
    sleep (0.5)
  </p>

  <p>
    # コピー & ペースト<br /> wsh.SendKeys (&#8216;^c^v&#8217;)
  </p>

  <p>
    sleep (0.5)
  </p>

  <p>
    # リーネム<br /> wsh.SendKeys (&#8216;{F2}test2{ENTER}&#8217;)
  </p>

  <p>
    # popup<br /> wsh.Popup (&#8216;Copy Success!!&#8217;)<br /> sleep (3)<br /> wsh.SendKeys (&#8216;{ENTER}&#8217;)<br /> [/sourcecode]
  </p>
</div>

23 Nov 2014, 06:35

Windows での コマンドラインからコピーするコマンドまとめ (xcopy, robocopy, copy)

はじめに

コマンドプロンプトからフォルダのコピーがしたかったので, 調べてみた.

Windows 標準コピーコマンド

Windows8 には, 標準で以下のコマンドが利用できる.

  • copy
  • xcopy
  • robocopy

copy

<div class="outline-text-3" id="text-2-1">
  <p>
    Windows 標準のファイルコピーコマンド.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.k-tanaka.net/cmd/copy.php">コマンドプロンプト copy &#8211; ファイルをコピーする</a>
    </li>
  </ul>
</div>

xcopy

<div class="outline-text-3" id="text-2-2">
  <p>
    copy の改良版. copy よりも高機能.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.k-tanaka.net/cmd/xcopy.php">コマンドプロンプト xcopy &#8211; ファイルをディレクトリ構造ごとコピーする</a>
    </li>
  </ul>

  <p>
    ディレクトリツリーごとコピーできるところが, copy との最大の違い. xcopy があれば, copy はいらない.
  </p>

  <p>
    copy は内部コマンド, xcopy は外部コマンド.
  </p>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221;]<br /> xcopy /e "C:\Users\tsu-nera\Desktop\test" "\\192.168.100.100\共有"<br /> [/sourcecode]
  </p>
</div>

robocopy

<div class="outline-text-3" id="text-2-3">
  <p>
    xcopy よりも高機能なコマンド. リモート間のフォルダ同期ができる. バックアップならば, robocpy が適している.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.atmarkit.co.jp/ait/articles/0704/20/news130.html">Windows TIPS:robocopy でフォルダをバックアップ/ 同期させる &#8211; @ IT</a>
    </li>
  </ul>
</div>

速度について

xcopy と robocopy

<div class="outline-text-3" id="text-3-1">
  <p>
    比較動画をみつけた. robocopy の勝利.
  </p>

  <p>
    <iframe width="420" height="315" src="//www.youtube.com/embed/1y7vmIvK2z8" frameborder="0" allowfullscreen></iframe> </div> </div> 

    <div id="outline-container-sec-3-2" class="outline-3">
      <h3 id="sec-3-2">
        Explore での手動コピーとの違い
      </h3>

      <div class="outline-text-3" id="text-3-2">
        <p>
          調べてみると, xcopy のほうが手動コピーよりも早いらしい.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://okwave.jp/qa/q6547486.html">通常コピーと CMD でコピー速度の差の理由は? 【 OKWave 】</a>
          </li>
        </ul>

        <p>
          ちなみに, explore.exe にもコマンドラインオブションはある. コマンドプロンプトから指定したフォルダを開くことがてきる. コピーや移動はできないみたい.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://support.microsoft.com/kb/152457/ja">Windows エクスプローラのコマンドライン オプション</a>
          </li>
        </ul>
      </div>
    </div>

    <div id="outline-container-sec-3-3" class="outline-3">
      <h3 id="sec-3-3">
        FastCopy
      </h3>

      <div class="outline-text-3" id="text-3-3">
        <p>
          ためしていないけれども, FastCopy というものがあるらしい. なんでも, robocopy, xcopy よりも高速とか.
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://www.se-support.com/server/fileserver-copy.html">高速コピーツール「 FastCopy 」はホントに早かった! ファイルサーバー移行テスト</a>
          </li>
        </ul>
      </div>
    </div></div> 

    <div id="outline-container-sec-4" class="outline-2">
      <h2 id="sec-4">
        おまけ
      </h2>

      <div class="outline-text-2" id="text-4">
        <p>
          ダミー用データ作成.以下を参考に .
        </p>

        <ul class="org-ul">
          <li>
            <a href="http://www.atmarkit.co.jp/ait/articles/0209/28/news002.html">Windows TIPS:巨大なサイズのファイルを簡単に作る方法 &#8211; @ IT</a>
          </li>
        </ul>

        <p>
          [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221;]<br /> # 1KB のファイル作成.<br /> fsutil file createnew 1K_test 1024
        </p>

        <p>
          # 1MB のファイル作成.<br /> fsutil file createnew 1M_test 1048576
        </p>

        <p>
          # 1GB のファイル作成.<br /> fsutil file createnew 1G_test 1073741824<br /> [/sourcecode]
        </p>
      </div>
    </div>

16 Sep 2014, 12:40

Windows8 で Loopback Adapter を利用するためのメモ

はじめに

仕事では, windows 環境でネットワークの開発をしている.

開発用には ローカルホストがあると便利だけれども, Windows では Linux のように簡単にはローカルホストを利用できなかった.

LoopBack Adapter というものを利用するとよいことを知ったので, 導入手順をメモします.

WireShark で LoopBack Adapter をみる方法もメモします.

Environment

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      Windows8
    </li>
  </ul>
</div>

Loopback Adapter とは

Loopback とは

<div class="outline-text-3" id="text-2-1">
  <p>
    ip アドレスは必ずしもリモートホストと関連付けられている必要はない. 得に開発環境では, ローカルな IP アドレスが役に立つ.
  </p>

  <p>
    自端末に対して通信することを LoopBack という. LoopBack で指定するアドレスを Loopback Address という.
  </p>

  <ul class="org-ul">
    <li>
      ハードウェアと関係ない, 論理的なインタフェース.
    </li>
    <li>
      Linux では, localhost と言われている. IP は 127.0.0.1
    </li>
  </ul>

  <p>
    <a href="http://e-words.jp/w/E383ABE383BCE38397E38390E38383E382AF.html">ループバックとは 〔 ローカルループバック 〕</a>
  </p>
</div>

Windows LoopBack Adapter とは

<div class="outline-text-3" id="text-2-2">
  <p>
    Windows で Loopback Address を利用するためのアダプター. Microsoft から無料で提供されている.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://support.microsoft.com/kb/236869/ja">Microsoft Loopback Adapter をインストールする方法</a>
    </li>
  </ul>
</div>

Loopback Adapter をインストールする

以下のページに画像付きの手順があるので参考にした.

Windows7 とほぼ手順はおなじだけれども, インストールする際の名称が Microsoft KM-TEST Loopback Adapter だった.

Loopback Adapter を設定する

以下のページに画像付きの手順があるので参考にした.

IP はとりあえず以下を利用.

  • ip: 10.0.0.2
  • subnet: 255.255.255.0
  • gateway: 10.0.0.1
  • DNS: 127.0.0.1

WireShark でパケットキャプチャーする

WireShark Wiki ページによると, 3 つの方法があるようだ.

  • route add
  • Proxocket
  • RawCap

CaptureSetup/Loopback – The Wireshark Wiki

結論としては, RawCap がうまくいった.

ローカルマシンに route add する方法

<div class="outline-text-3" id="text-5-1">
  <p>
    Add a route to your local machine going through the network gateway
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> route add <your_IP> mask 255.255.255.255 <the_gateway> metric 1<br /> [/sourcecode]
  </p>

  <p>
    自分の環境で頑張ってみたのだが, どうも動かなかった. Gateway の設定が違う気がするが&#x2026;
  </p>

  <p>
    以下の記事によると, Loopback Adapter より先に WireShark を インストールしていた場合は, WireShark の再インストールが必要?
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://stackoverflow.com/questions/5847168/wireshark-localhost-traffic-capture">Wireshark localhost traffic capture &#8211; Stack Overflow</a>
    </li>
  </ul>
</div>

Proxocket をつかう方法

<div class="outline-text-3" id="text-5-2">
  <p>
    Proxocket という dll を キャプチャしたいアプリと同じフォルダにいれて おくと, パケットキャプチャできるらしい. これは自分は未検証.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.netresec.com/archives/age=Blog&#038;month=2011-01&#038;post=Proxocket---A-Winsock-Proxy-Sniffer">Proxocket &#8211; A Winsock Proxy Sniffer &#8211; NETRESEC Blog</a>
    </li>
  </ul>
</div>

RawCap

<div class="outline-text-3" id="text-5-3">
  <p>
    唯一うまくいった方法.RawCap というツールを使う.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.netresec.com/archives/age=RawCap">RawCap &#8211; A raw socket sniffer for Windows</a>
    </li>
  </ul>

  <p>
    使い方は簡単. ダブルクリックで起動して, キャプチャしたいインタフェースを選択するだけ.
  </p>

  <p>
    キャプチャを終了するときには, Ctrl+C で終了させる. pcap 形式のファイ ルが作成されるため, これを wireshark で開けばよい.
  </p>

  <div class="figure">
    <p>
      <img src="http://futurismo.biz/wp-content/uploads/wpid-SnapCrab_NoName_2014-9-16_12-31-47_No-00.png" alt="SnapCrab_NoName_2014-9-16_12-31-47_No-00.png" />
    </p></p>
  </div>
</div>

24 May 2014, 06:18

Sikuli, Selenium, WSH, 3つの自動化ツールでGoogle検索自動化に挑め!

はじめに

前回、Sikuliの使い方を調べてみました。

今回は、Sikuliと別のツールを組み合わせてみます。前回記事の続編です。

やること

以下の手順を自動化します。

  1. firefoxを立ち上げる
  2. 検索窓にSikuliと入力する
  3. 検索ボタンをおす

以下のツールを利用します。

  • Sikuli … 画像認識による自動化ツール
  • Selenium … HTML解析による自動化ツール
  • WSH … キー操作の自動化ツール

なんだか、ヨットに対して戦車と軍艦と戦闘機で総攻撃をかけるような感じになってきた。

使う手段

JRubyです。以下を利用。

  • win32ole
  • sikulixapi
  • selenium-webdriver

win32oleはデフォルトで入っている。sikuliは前回記事を参照。

selenium-webdriverは、jgem install selenium-webdriverで問題なくインストール。

結果

自動化がキマるとけっこうきもちいい。

22 Mar 2014, 07:27

RSpecでWindows-31Jの文字コードを使うときのメモ

RSpecで Windows-31Jのエンコードを扱うときにハマったので、作業メモ。

Rubyファイルのエンコードについて

Rubyでは、ファイルのエンコードを判定するために、 ファイル冒頭のマジックコメントを利用している。


UTF-8の場合
# coding: utf-8

Windows-31Jの場合
# coding: Windows-31J

エンコードのことなる関係でRubyを利用するときは注意が必要。

Rubyでは、文字列のエンコードを変換するために、以下のメソッドがある。


# 戻り値として変更
str.encode!("UTF-8")

# 上書き変更
str.encode!("UTF-8")

# エンコードを調べる
str.encoding

RSpecでのエンコード

RSpecで文字列を比較するときは、当然文字コードが期待値と結果で同一な必要がある。

specファイルもテスト対象も同一の文字コードで記述すれば比較は問題ない。

しかし、普段Emacsに結果を表示していて、その表示がUTF-8でないと文字化けしてしまう。

しかたがないので、以下のようにした。

  • specファイルは UTF-8
  • テスト対象ファイルは Windows-31J
  • specからテスト対象を呼び出すときと、結果の比較で encodeメソッドを利用する。
it "日本語" do
  line = "SCENARIO_NAME = \'こんにちは\'".encode!("Windows-31J")
  @perser.parse(line, @regexp).should == "こんにちは".encode!("Windows-31J")
end

09 Sep 2012, 07:42

WindowsバッチファイルをJenkinsで起動したらネットにアクセスできない

Selenium RCの起動をWindowsのバッチファイルにして、Jenkinsから起動したら、

Firefoxを立ち上げたところで処理が止まってしまう。

05:55:02.690 INFO – Preparing Firefox profile…

05:55:04.964 INFO – Launching Firefox…

05:55:06.985 INFO – Checking Resource aliases

Jenkinsを介さずに、Windowsのコマンドプロンプトからならば、

処理が停滞しないので、さらにわけが分からない。

どうやら、Jenkinsからではインターネットにアクセスできないようだ。

処理が停滞するのは、URLのopenがタイムアイトしているから。

JenkinsはWindowsのサービスとして起動している。

そして、Windowsのサービスからインターネットにアクセスしようとして、

ファイアウォールに引っかかっているようだ(という推測)。

[コントロールパネル]>[管理ツール]>[サービス]

からJenkinsのプロパティを開いて、

[ログオン]タブの『デスクトップとの対話をサービスに許可』

を選択すると、サービスが起動している画面に移動でき、

停滞している画面を見ることができる。

image

image

メッセージの表示を選択すれば、Firefoxが停滞している様子が見える。

この課題を解決するには、ネットワーク設定をいじる必要がありそうだけれど、

よくわからなかった。

Slaveノードを作成して、Windowsサービスとして登録せずに起動する

自分がたどりついた方法は、Slaveノードを作成して、

そいつはWindowsサービスとしては登録しないまま、ネットにアクセスさせる方法。

まずは、

[Jenkinsの管理] > [ノードの管理]> [新規ノードの作成]からノード作成。

このとき、

詳しくは参考ページを参照。

Jenkinsスレーブの作成と設定 -ムーチョのメモ帳
https://wiki.jenkins-ci.org/display/JA/Step+by+step+guide+to+set+up+master+and+slave+machines

作成したノードをブラウザ上から立ちあげると、こんな窓が出てくる。

image

この状態で、Seleniumパッチを実行すると、問題なくネットへアクセスできた。

 

JenkinsをWindowsサービスとして立ちあげない

昨日のエントリの続き。

寝て起きたら、もっとカンタンな(当たり前な?)方法を思いついた。

JenkinsがWindowsのスタートアップでサービスとして起動することが問題なので、

サービスを無効にしてしまえばよい。

[コントロールパネル]>[管理ツール]>[サービス]

からJenkinsのプロパティを開いて、サービスを停止する。

停止したら、コマンドラインから、Jenkinsを手動で立ち上げなおす。

cd ”C:\xxxxxx\Jenkins”

java -jar jankins.war

すると、しばらくしてJenkinsがWindowsのサービスとしてではなく

立ちあがるので、この状態ならばネットにつなげた。