主に言語とシステム開発に関して RSSフィード



2008-10-28

コマンドラインからプロセスを起動・終了する方法 (環境変数とレジストリについて)

| 11:18 |  コマンドラインからプロセスを起動・終了する方法 (環境変数とレジストリについて)のブックマークコメント



Windows コマンドプロンプト上から,アプリケーションを起動したり終了させたりする方法。

  • C:\WINDOWS\system32\taskmgr.exe
  • C:\Program Files\Internet Explorer\iexplore.exe
  • C:\Program Files\ffftp\FFFTP.exe

の3つのアプリケーションについて,4種類の異なる起動方法が存在するのを確認する。


この面でコマンドプロンプトを手の延長にすれば,あちこちのフォルダを探しまわる事なくアプリケーションを起動できて便利なはず。



(1) PATHを利用して起動

コマンドラインに


	taskmgr.exe

と打ちこむとタスクマネージャが起動される。


ファイル名だけで起動できる理由は,このファイルの存在するディレクトリ C:\WINDOWS\system32\ が,環境変数PATHに含まれているから。


PATHをGUI上で設定するには,よく知られている通り

  • Windowsキー+E でマイコンピュータを開いてから
  • マイコンピュータ
  • →コントロールパネル
  • →システム
  • →詳細設定
  • →環境変数
  • →PATH を編集する。

これでは操作が面倒なので,コマンドライン上から


	set PATH=%PATH%;C:\Program Files\ffftp\;

のように追加設定することもできる。

この設定後は,「FFFTP.exe」と入力しただけで FFFTP が利用できる。


ただし,set コマンドで設定した変数は,そのコマンドプロンプトのウィンドウを開いている間のみ有効。すぐ使えなくなってしまう。

(setのかわりに「PATH」という名前の別のコマンドもあるが,これを使って直接pathを設定しても,有効期限は同じである。)


なので,本当によく使うアプリケーションが集中して存在するディレクトリのみ,コントロールパネルからPATHを通すようにしておくのがよいだろう。



(2) レジストリを利用して起動

IEを起動したい場合, iexplore.exe と打ちこんだだけでは

'iexplore.exe' は、内部コマンドまたは外部コマンド、

操作可能なプログラムまたはバッチ ファイルとして認識されていません。

のエラーメッセージが出る。

原因は,IEはPATHの通ったディレクトリ上には存在しないため。


かわりに


	start iexplore.exe

とすればIEを起動できる。



startコマンドは,HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths というレジストリキーの値を参照する。

もしもこのレジストリの中にアプリケーションのファイルパスが含まれていれば,

  • start ファイル名
  • 「ファイル名を指定して実行」

のどちらからも実行する事ができるのだ。


試しに,このレジストリキーの中に,IEが含まれている事を確認してみよう。


regeditを使ってGUI上で確認する手もある。しかし,せっかくだからコマンドライン上からレジストリキーの値を表示させる事にする。



	reg query レジストリキー名

レジストリの値を表示できるが,キーに空白を含むので,ここでは

reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths" | findstr /I ".exe"

とする。

finsdtr で「.exe」を含む行だけを抽出表示させている。/I は,大文字・小文字の区別を無視するオプション。

出力結果を見ると,確かに

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE

というのが含まれている。

このおかげで,IEやExcelなどのアプリケーションはPATHに設定が無いにも関わらず,「start」からも,「ファイル名を指定して実行」からも,ファイル名だけで実行する事ができるのだ。


App Pathsとregコマンドの詳細は下記を参照:

IEやExcelなど、PATHにないアプリを起動するバッチやショートカットの作り方

http://scripting.cocolog-nifty.com/blog/2007/02/ieexcelpath_6480.html

コマンド・プロンプトでレジストリを操作する

http://www.atmarkit.co.jp/fwin2k/win2ktips/391cmdreg/cmdreg.html


また,startコマンドは,前のプロセスの終了を待たずに連続してアプリケーションを起動するためにも利用できる。

http://okwave.jp/qa2167876.html

ただ単に

"[IEのパス]\iexplorer.exe"

と3行書いただけだと、まずIEがひとつ開いて、とまってしまい

開いたIEを閉じるとまたIEが開き、それを閉じたらまたIEが開く。

と言うように、閉じないとバッチファイルが先に進んでくれません。


Windows のコマンド プロンプトからプログラムを起動する方法

http://support.microsoft.com/kb/126410/ja


(3) 絶対パス指定で起動

PATHやレジストリの操作なしに,C:\Program Files\ffftp\FFFTP.exe を起動したいとしよう。

コマンドラインから,この通りのパスを打ち込むと

’C:\Program’は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。

というエラーメッセージが返ってくる。

原因は,ファイルパスにスペースが含まれているため。


このエラーを回避するためには,


	"C:\Program Files\ffftp\FFFTP.exe"

のように二重引用符でくくればよい。

「C:」のようにドライブ名を含む部分を環境非依存にするためには


	"%ProgramFiles%\FFFTP\ffftp.exe"

のように,絶対パス中に環境変数を含める。


なお,PC内で定義されている環境変数の一覧をリスト表示させるには


	set

と入力すればよい。

ProgramFiles=C:\Program Files

のような設定状況を確認できる。


(4)設置ディレクトリまで移動して起動

アプリケーションを起動したのち,そのプログラムの存在するディレクトリ上で何かしら処理を行ないたいとする。

その場合,絶対パス指定であれこれ操作するよりも,アプリケーションの存在するディレクトリまで一度移動してしまった方が楽だ。


	cd "%ProgramFiles%\FFFTP" 
	ffftp.exe

複数行の命令を一行にまとめて書きたいならば,& でつなげて


	cd "%ProgramFiles%\FFFTP" & ffftp.exe

とする事もできる。


しかしこれでは,元のフォルダに戻るのが面倒だ。


訪問したフォルダの「履歴」を作成して,前いたフォルダに戻る方法がある。

  • pushd フォルダ名 :ディレクトリを移動し,移動先ディレクトリを履歴として記憶させる
  • popd :以前に記憶させたディレクトリに戻る

の2つのコマンドを使う。


	pushd . 
	〜 
	popd

〜の部分に処理を書く。

「.」はpushd実行時のカレントディレクトリと解釈され,あとでそこに戻ってくることができる。


上の例でいえば,


	pushd . 
	cd "%ProgramFiles%\FFFTP"
	ffftp.exe

	〜〜このフォルダ上での何らかの処理

	popd

のようになる。


起動の方法はこれら4つ。


コマンドラインでプロセスを終了させる

終了の方法に移る。


Windows自体を終了させる場合は,shutdownコマンドを使う。


	すべてのプログラムを強制終了
	shutdown -f


	再起動
	shutdown -r

これはリモートデスクトップでの操作時など,終了ボタンが表示できない環境でよく使う。



単一のプロセスだけを終了させたい場合は,taskkillを使う。

http://ykr414.com/dos/dos04.html#29


	プロセスIDで指定して終了
	taskkill /pid 1234


	プロセス名で指定して終了
	taskkill /fi "imagename eq iexplore.exe"

残念ながら,taskkillコマンドはXP home editionには入っていない。

かわりに,代替ソフトを使ってtaskkillと同じ機能を実現する事ができる。

taskkill簡易版

http://www.vector.co.jp/soft/winnt/util/se401845.html



何かソフトをダウンロードするのは面倒だという場合,WSHで下記のスクリプトを作成・実行する手もある。


var ws = WScript.CreateObject("WScript.Shell");
ws.AppActivate("マスタ音量");
ws.Sendkeys("%{F4}");

これを〜.jsで保存してダブルクリックで実行すると,「マスタ音量」という題名のウィンドウ(つまりボリュームコントロール)が自動的に閉じられる。

アプリケーションのタイトルがわかる場合は便利だろう。



また,WSH内で起動したプロセスであれば,Terminateメソッドを使って終了できる。

Windows Script FAQ / アプリケーションを終了するには?

http://winscript.s41.xrea.com/wiki/index.php?FAQ#content_1_9


起動・終了方法のまとめ

起動

  • PATH追加
    • set PATH=%PATH%;ファイルパス
    • ファイル名 で起動
  • レジストリ追加
    • start ファイル名 で起動
  • 絶対パス
    • "%ProgramFiles%\ファイルパス" のように起動
  • 移動して戻る
    • pushd . & cd ファイルパス & 実行 & popd

終了

  • プロセスごとに
    • taskkill /pid 1234
    • taskkill /fi "imagename eq iexplore.exe"-
  • WSH
    • Sendkeys("%{F4}")
  • Windows自体
    • shutdown -f
    • shutdown -r (再起動)

ソフトウェアの起動バッチを読み書きする際に役立つだろう。(特に環境変数回りの扱い方)


関連する記事:

コマンドプロンプトで,暗記するべき10の必須コマンド  (前半) ファイル処理系 - 主に言語とシステム開発に関して

http://d.hatena.ne.jp/language_and_engineering/20081001/1222857265


バッチで,レジストリの値の読み取り・書き込み・存在判定をしよう(WSH/JScriptでレジストリ操作のサンプルコード) - 主に言語とシステム開発に関して

http://d.hatena.ne.jp/language_and_engineering/20100908/p1


共有フォルダ上で,マウスだけで一発でコマンドプロンプトを開く方法 (UNCパスへのpushdをバッチクリックで済ませる) - 主に言語とシステム開発に関して

http://d.hatena.ne.jp/language_and_engineering/20090305/p1


コマンドプロンプトから,Win32 APIや任意のDLLを呼び出して実行しよう (コマンドプロンプトから画面キャプチャする方法の仕組みを理解) - 主に言語とシステム開発に関して

http://d.hatena.ne.jp/language_and_engineering/20100804/p1


メモリ・CPUなどハードウェアの構成情報を,バッチで取得しよう (WSH/JScriptでWMIを使う方法) - 主に言語とシステム開発に関して

http://d.hatena.ne.jp/language_and_engineering/20100906/p1

 

リンク元