"net file"の出力結果を取得するには?

解決


HIRORO  2009-12-31 12:26:14  No: 36573

共有ファイルの情報を取得しようと"net"コマンドの"net file"の出力結果をDelphiにて
得ようとしているのですが、通常のコマンドプロンプトと同じやり方で出力結果を得ようと
しても取得できません。

違いを調べようと、コマンドプロンプトを起動して"net file"を実行すると画面に結果は
表示されるのですが、バッチファイルに記載して実行すると結果は表示されません。
これにより通常のコマンドプロンプトで実行するものとは種類が違うのではないかと
思うのですが何か良い方法はあるでしょうか?

このサイト内でも"net file"に触れているものはありますがそれまでしかないようでしたので
ご存知の方、ご教授願います。


igy  2009-12-31 17:14:06  No: 36574

試していないのですが、

net file > hoge.txt

を実行し、 hoge.txt を読み込むのは、いかがですか?


あんまり見ていませんが  2009-12-31 18:43:14  No: 36575

Delphiでのパイプ処理を扱っているようです。
http://www.autch.net/page/tips/delphi_anonymous_pipe.html


HIRORO  2009-12-31 22:56:19  No: 36576

igyさん、ありがとうございます
>net file > hoge.txt
は、コマンドプロンプトを出して手動で打ち込むのであれば出来ると思いますが
それを自動的にプログラムから実行したり、バッチファイルで処理できないので
その方法も使えません。

あんまり見ていませんが  さん、ありがとうございます
パイプ処理に関しても以前より使っていたので試していましたが、バッチファイルと
同じようにこれでも結果は処理できません。

共有ファイルなど作成していないパソコンであっても"net file"を実行すると
「一覧にエントリが存在しません」と表示されるのでこのメッセージがプログラム上にて
取得できれば成功と言えると思うのですが、さらに情報があればよろしくお願い致します。


ささ  2009-12-31 23:36:31  No: 36577

>自動的にプログラムから実行したり、バッチファイルで処理できないので
バッチファイルの自動生成、実行は可能ですよ?
TMemo.savetofile('c:\test.bat'),TMemo.loadfromfile,Shellexecute

ちなみに以下のバッチファイルで「一覧にエントリが存在しません」
をc:\test.txtに取得できました(WinXP SP3)。

net file > c:\test.txt

この後TMEMOなりなんなりにc:\text.txtを読み込めば、
プログラム上で「一覧にエントリが存在しません」を取得できるでしょう。

何が問題なのかがわかりません。
最終的に何をどうしたいのですか?


HIRORO  2010-01-01 01:22:15  No: 36578

ささ  さん、ありがとうございます。

ご指摘通りに行なうとできました。

元々、どなたでも最初に考えられると思いますが"net file"コマンドをバッチファイルなどに」出力せずにプログラム内にて結果出力を得ようとしていました。
しかし、あんまり見ていませんが さんが提案していただいた方法などを行なって
いただくとわかると思いますが、出力結果が得られません。
内部で結果がでないまま、同じコマンド(net file)が何度も繰り返し行なわれて
いるようでフリーズしたようになります。
下記のようなバッチファイルを作って実行していただいてもわかると思いますが
結果が表示されなかったため、"net"コマンドそのものが特殊なものであるため
別の処理が必要だと思っていました。
実際、WMIなどでは処理できないようなので同じとはいえないと思いますが。

バッチファイルによるファイル出力も試していたのですが、私の開発環境が少し
おかしくなっていたようです。

今回の最終目的は、共有フォルダ監視ソフトを作成する事です。
ファイル出力と読込によって、処理が遅くなるとは思いますが目的の事ができそうなので
これで解決とさせていただきます。

みなさん、ささ  さん、ありがとうございました。


HIRORO  2010-01-01 01:26:21  No: 36579

下記のようなバッチファイル を記載し忘れていました。

net file
pause

上記では表示されません。


D  2010-01-01 01:47:46  No: 36580

パイプでも「一覧にエントリが存在しません」を取得できました。

procedure TForm1.Button1Click(Sender: TObject);
const
  lci_BUFFSIZE = 1024;
var
  lp_Buff: PAnsiChar;
  li_BuffSize, li_Count, li_ExitCode: DWORD;
  lh_Read, lh_Write: THandle;
  lr_Startup:  TStartupInfo;
  lr_Process:  TProcessInformation;
  lr_Security: TSecurityAttributes;
begin
  Memo1.Clear;

  FillChar(lr_Security, SizeOf(lr_Security), 0);
  with lr_Security do begin
    nLength              := SizeOf(lr_Security);
    lpSecurityDescriptor := nil;
    bInheritHandle       := True;
  end;
  if (CreatePipe(lh_Read, lh_Write, @lr_Security, 0)) then begin
    FillChar(lr_Startup, SizeOf(lr_Startup), 0);
    with lr_Startup do begin
      cb          := SizeOf(lr_Startup);
      dwFlags     := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
      wShowWindow := SW_HIDE;
      hStdInput   := lh_Read;
      hStdOutput  := lh_Write;
      hStdError   := lh_Write;
    end;

    if (CreateProcess(
        nil,
        PChar('net file'),
        nil,
        nil,
        True,
        CREATE_NEW_CONSOLE,
        nil,
        nil,
        lr_Startup,
        lr_Process
    )) then begin
      repeat
        GetExitCodeProcess(lr_Process.hProcess, li_ExitCode);
        PeekNamedPipe(lh_Read, nil, 0, nil, @li_BuffSize, nil);
        if (li_BuffSize <> 0) then begin
          lp_Buff := AllocMem(li_BuffSize+1);
          try
            ReadFile(lh_Read, lp_Buff[0], li_BuffSize, li_Count, nil);
            if (li_Count > 0) then begin
              Memo1.Text := Memo1.Text + String(lp_Buff);
            end;
          finally
            FreeMem(lp_Buff);
          end;
        end;
        Sleep(1);
        Application.ProcessMessages;
      until (li_ExitCode <> STILL_ACTIVE);
      TerminateProcess(lr_Process.hProcess, 0);
      CloseHandle(lr_Process.hThread);
      CloseHandle(lr_Process.hProcess);
    end;
    CloseHandle(lh_Read);
    CloseHandle(lh_Write);
  end;
end;


HIRORO  2010-01-05 01:25:28  No: 36581

(ノ゜○゜)ノお〜〜

Dさん、ありがとうございます!

サーバーにて共有ファイルなどの情報が取得できることを確認しました。
フリーやシェアなどの動作が重いなど、良いものがありませんでしたので
負荷をあまりかけない必要な監視ソフトが作成できそうです。

ご回答いただいたみなさん、ありがとうございました。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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