Sponsored Link
[WSH]Sendkeysの文字化け対策
Sendkeysが文字化ける
Sendkeysメソッドでは日本語(正確には2バイト文字)が文字化けします。
しかし、2バイト文字をSendkeysメソッドで送信したいケースもあるはず。
その場合、ちょっと無理矢理感もありますがコピペで対応すれば文字化けません。
WSHでコピー & ペースト
var sh = WScript.CreateObject("WScript.Shell");
// 文字列をクリップボードに格納
sh.Run( "cmd.exe /c echo 格納したい文字列 | clip", 0, true );
// 改行させたくない場合はこっち
// sh.Run( "cmd.exe /c set /p dummy="格納したい文字列" | clip", 0, true );
// ペースト
sh.SendKeys( "^v" );
※補足※
cmd.exe /c <command>
/c <command>
で、<command>
で書かれたコマンドを実行して終了します。
<command>
はDOSコマンドを入力します。
今回の例の場合は、
cmd.exeを起動して、/c 以降に書かれているDOSコマンドを実行して、cmd.exeを終了させる。
と、いうことになります。
RunメソッドとExecメソッド
任意のプログラムを実行するメソッド
Run(strCommand[, intWindowStyle[, bWaitOnReturn]])
- strCommand
実行するコマンドを入力します - intWindowStyle
ウィンドウの状態を定数で指定します。(規定値は1) - bWaitOnReturn
スクリプトと同期させるかを真偽値で指定します(規定値はfalse)
trueのとき、Run()メソッドで呼び出したプログラムが終了するまで、スクリプトの処理は停止します。
戻り値は正常に完了した場合は0を返します。エラーがあった場合、該当のエラー値が返ります。
falseのときは、スクリプトの処理は停止せず、非同期で次の処理を実行します。戻り値は必ず0が返ります。
intWindowStyleの状態については下記の通りです。
定数 | 内容 |
---|---|
0 | ウィンドウを非表示にし、別のウィンドウをアクティブにします。 |
1(規定値) | ウィンドウをアクティブにして表示します。ウィンドウが最小化または最大化されている場合は、元のサイズと位置に戻ります。アプリケーションでウィンドウを最初に表示するときには、このフラグを指定してください。 |
2 | ウィンドウをアクティブにし、最小化ウィンドウとして表示します。 |
3 | ウィンドウをアクティブにし、最大化ウィンドウとして表示します。 |
4 | ウィンドウを最新のサイズと位置で表示します。アクティブなウィンドウは切り替わりません。 |
5 | ウィンドウをアクティブにし、現在のサイズと位置で表示します。 |
6 | 指定したウィンドウを最小化し、Z オーダー上で次に上位となるウィンドウをアクティブにします。 |
7 | ウィンドウを最小化ウィンドウとして表示します。アクティブなウィンドウは切り替わりません。 |
8 | ウィンドウを現在の状態で表示します。アクティブなウィンドウは切り替わりません。 |
9 | ウィンドウをアクティブにして表示します。ウィンドウが最小化または最大化されている場合は、元のサイズと位置に戻ります。アプリケーションで最小化ウィンドウを復元するときには、このフラグを指定してください。 |
10 | アプリケーションを起動したプログラムの状態に基づいて、表示状態を設定します。 |
Runメソッドを使った場合に直接操作できるのは、
起動の際に最小化・最大化などの表示方法を指定することと、
プログラムの終了を待つ場合に終了コードを取得することのみです。
- Exec(strCommand)
strCommand
実行するコマンドを入力します。
Execメソッドは、非同期で実行されます。
コマンドライン・アプリケーションに対してよく用いられ、
プログラムの標準入力/標準出力/標準エラー出力を利用できます。
戻り値はWshScriptExecオブジェクトを返します。
WshScriptExec オブジェクトのプロパティとメソッド
非同期ではありますが、Statusプロパティを得ることが出来るので戻り値によって、
実行の状態を判定することが出来ます。
CScript
でスクリプトを実行した場合
Runメソッドでは現在とは別の新しいコマンド・プロンプトが作成される
Execメソッドでは新しいコマンド・プロンプトは表示されず、CScriptを実行したコマンド・プロンプトがそのまま使われる。
RunメソッドとExecメソッドの違いをまとめると次のようになる。
Runメソッド | Execメソッド | |
---|---|---|
終了コードの取得 | ○ | ○ |
プロセスIDの取得 | × | ○ |
WSH 5.6以前の環境での利用 | ○ | × |
Windowsアプリケーション | ||
最大化・最小化状態で実行 | ○ | × |
コマンドライン・アプリケーション | ||
標準入出力の利用 | × | ○ |
ウィンドウ | 新しいコマンド・プロンプトを表示する | CScriptであれば表示しない |
Execメソッドのプロパティ
- ProcessID
起動させたアプリケーションのProcessIDを返します。
AppActivateメソッドで使用します。 - Status
起動させたアプリケーション(非同期)のステータスを返します。
実行中の場合は1、完了した場合は0を返します。
非同期で実行しているアプリケーションの状態を取得する為、状況によって値が変わります。 - StdIn
- StdOut
- StdErr
この三つはまだ使うときはやってきていない。
AppActivateメソッド
AppActivate(title)
titleで指定したアプリケーションをアクティブにします。
titleはタイトルバーに表示されているタイトル文字列か、プロセスIDを指定します。
プロセスIDはProcessIDプロパティで取得したもので指定できます。
戻り値は真偽値です。アクティブに出来なかった場合(存在しない場合も含む)はFalseを返します。
DOSコマンド
echo hoge
hoge
改行で表示
改行をなくしたい場合
set /p test="hoge" < nul
構文
/p <var_name>=[<String>]
ユーザーからの入力を変数<var_name>
に設定します。
<String>
を指定すると、それをユーザーに入力を促すプロンプトとして表示します。
(<String>
は改行されず、カーソルはその直後の位置で入力待ちの状態となります)
「=」文字は省略できませんが<String>
は省略することができます。
つまり、もともとはユーザーに入力させる為のコマンドだと思います。
それを無理矢理(?)「< nul」でnullをユーザー入力値に入れることにより、
結果<String>
のみを改行なしの文字列として表示させている感じだと理解してます。
(ググッた結果、これがバッチ処理でのテンプレートっぽい)
Windowsで改行せずに標準出力するときのイディオム – ぷちてく – Petittech
/c <command>
<command>
で書かれたコマンドを実行して終了します。
/k <command>
<command>
で書かれたコマンドを実行します。/cの終了しないバージョンです。
DOSコマンドでtxtファイルを作成
需要があるかは分からないけど、CreateTextFileメソッド
を使うより超簡単だったから
バッチで何かしらの表示テストとか、ログ記載とかサクッとtxtファイルで残したい場合はいいかも。
echo "test" > sample.txt
これで、「test」と記載されたsample.txtがカレントディレクトリに作成されます。
で、もしこのファイルに追記したい場合、
echo "Append Text" >> sample.txt
で、末尾から追記されていきます。
wshだったらこれでいけるはず。
sh.Run( "cmd.exe /c echo 格納したい文字列 > sample.txt", 0, true );
いちいち、CreateTextFileでファイル
を作ってからWriteとかWriteLineとかで書き込んでいくより楽。