WshのスクリプトをDelphiで使うには


くじら  2002-12-11 01:51:02  No: 2300

はじめまして。  くじらと申します。

Delphiの勉強を始めたばかりなのですが、以前作ったスクリプトなどをDelphiで動かしたいのですが、どうすればいいのかさっぱりわかりません。
なにかヒントや参考になるサイトなどの情報を教えてください。
ちなみに動かしたいのは

・Set WshNetwork = WScript.CreateObject("WScript.Network")
・Set objComputer = GetObject("winmgmts:impersonationLevel=impersonate}!//" & strPCName)
・Set NICs = objComputer.ExecQuery("select * from Win32_NetworkAdapterConfiguration")

こんなスクリプトです。
おかしな質問かもしれませんが、よろしくお願いします。


にしの  2002-12-11 02:35:31  No: 2301

とくに問題がないのであれば、WScriptやCScriptを直接ShellExecuteなどで起動してやるだけです。
Delphi側に値を返したい場合は、CreateProcessで終了時のコードを返すようにすればできると思います。
# 未確認
終了を待たないと問題が出るかもしれないので、CreateProcessやShellExecuteExで終了待ちしたほうがよいです。

また、Delphiのオブジェクトを操作したいのであれば、Delphi側にCOMを組み込んで、WSH側でCreateObjectして使います。


くじら  2002-12-11 03:16:45  No: 2302

くじらです。
にしのさん、返信ありがとうございます。

ログオンスクリプトなのでフォームはいらないのですが、どうすればいいでしょうか?
単純にフォームにからんでいそうな定義を消すとエラーになってしまいます。
シロート質問で申し訳ないのですが、教えてください。

よろしくお願いします。


たかみちえ  URL  2002-12-11 05:31:16  No: 2303

問題ないのなら、コンソールアプリケーションとして作ったらどうでしょうか?
  "新規作成"から、"コンソールアプリケーション"を選びます。
すると、説明文つきのプロジェクトソースが作成されるので、
begin
end.
の間に、命令文を書きます。
  命令文に使えるもの(関数)は基本的にGUIアプリケーションのときと基本的に同じです。
(Application変数などは使えません)
コンソールに内容を出力するには、WriteやReadの関数を使えばいいです。


にしの  2002-12-11 06:40:42  No: 2304

すみません、読み違えていたみたいですね。
てっきり、「WSHスクリプトを、Delphiで作成したアプリケーションから実行するには」ってことだと思いました。
「WSHスクリプトで書かれたものを、Delphiに移植するには」ってことですね。

ちょっと調べてみます。


にしの  2002-12-11 19:58:54  No: 2305

調べてみたところ、GetObjectにあたるDelphiの関数が見つかりませんでした。
CreateObjectは、CreateOleObjectがそれにあたるので移植可能ですが、GetObjectは無理そうです。

DelphiからWSHを呼び出し、WSHからその結果をDelphiに返す(ファイル経由が楽)というのが簡単です。

WSHに関するタイプライブラリを使ってActiveXコンポーネントを作成すればもしかしたらできるかもしれませんが、未確認です。


にしの  2002-12-12 03:25:45  No: 2306

もしかしたら出来るかもしれません。

objComputer = GetObject("winmgmts:{impersonationLevel=impersonate}")
にあたるDelphiコードは、
  Locator := CreateOleObject('WbemScripting.SWbemLocator');
  Service := Locator.ConnectServer();
になります。

"!//コンピュータ名"がつくのなら、ConnectServerの引数に渡せばできそうです。
# 引数に関しては調べ切れませんでした

試しにドライブ一覧を出すスクリプトを、Delphiでコーディングする例を出そうと思ったのですが、一覧する部分(For each Disk in DiskSetの部分)がわかりませんでした。

一応、途中までのソースです。

procedure TForm1.Button1Click(Sender: TObject);
var
  Locator: OleVariant;
  Service: OleVariant;
  DiskSet: OleVariant;
  Disk: OleVariant;
  i: integer;
  Count: Integer;

  e: Variant;
begin
  Locator := CreateOleObject('WbemScripting.SWbemLocator');
  Service := Locator.ConnectServer();
  DiskSet := Service.ExecQuery('Select * From Win32_LogicalDisk Where DriveType=3');

  Memo1.Lines.Add(IntToStr(VarArrayDimCount(DiskSet)));

  Count := DiskSet.Count;
  //e := DiskSet.GetQuery;

  for i := 1 to Count do
  begin
    Disk := DiskSet.Data[i]; // ← ここが間違い
    Memo1.Lines.Add('Drive ' + Disk.Name + ':');
  end;
end;

以下は、WSHのソースです。
Set Locator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set Service = Locator.ConnectServer()
Set DiskSet = Service.ExecQuery("Select * From Win32_LogicalDisk Where DriveType=3")
For Each Disk In DiskSet
    WScript.Echo "Drive " + Disk.Name + ":"
Next


くじら  2002-12-17 21:02:14  No: 2307

くじらです。ご連絡が遅れてしまいすいません。
たかみちえさん、にしのさん返信ありがとうございます。

たかみちえさんの
・コンソールアプリケーションを作成する
にしのさんの
・Locator := CreateOleObject('WbemScripting.SWbemLocator');
  Service := Locator.ConnectServer();
(サンプルコードまでありがとうございます。WSHと見比べて参考にさせていただきます。)

このへん調べて頑張ってみます。
うまくいきましたら改めてご報告させていただきます。

またわからないところがありましたら、ご教授お願いします。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加