共有ファイルの情報を取得しようと"net"コマンドの"net file"の出力結果をDelphiにて
得ようとしているのですが、通常のコマンドプロンプトと同じやり方で出力結果を得ようと
しても取得できません。
違いを調べようと、コマンドプロンプトを起動して"net file"を実行すると画面に結果は
表示されるのですが、バッチファイルに記載して実行すると結果は表示されません。
これにより通常のコマンドプロンプトで実行するものとは種類が違うのではないかと
思うのですが何か良い方法はあるでしょうか?
このサイト内でも"net file"に触れているものはありますがそれまでしかないようでしたので
ご存知の方、ご教授願います。
試していないのですが、
net file > hoge.txt
を実行し、 hoge.txt を読み込むのは、いかがですか?
Delphiでのパイプ処理を扱っているようです。
http://www.autch.net/page/tips/delphi_anonymous_pipe.html
igyさん、ありがとうございます
>net file > hoge.txt
は、コマンドプロンプトを出して手動で打ち込むのであれば出来ると思いますが
それを自動的にプログラムから実行したり、バッチファイルで処理できないので
その方法も使えません。
あんまり見ていませんが さん、ありがとうございます
パイプ処理に関しても以前より使っていたので試していましたが、バッチファイルと
同じようにこれでも結果は処理できません。
共有ファイルなど作成していないパソコンであっても"net file"を実行すると
「一覧にエントリが存在しません」と表示されるのでこのメッセージがプログラム上にて
取得できれば成功と言えると思うのですが、さらに情報があればよろしくお願い致します。
>自動的にプログラムから実行したり、バッチファイルで処理できないので
バッチファイルの自動生成、実行は可能ですよ?
TMemo.savetofile('c:\test.bat'),TMemo.loadfromfile,Shellexecute
ちなみに以下のバッチファイルで「一覧にエントリが存在しません」
をc:\test.txtに取得できました(WinXP SP3)。
net file > c:\test.txt
この後TMEMOなりなんなりにc:\text.txtを読み込めば、
プログラム上で「一覧にエントリが存在しません」を取得できるでしょう。
何が問題なのかがわかりません。
最終的に何をどうしたいのですか?
ささ さん、ありがとうございます。
ご指摘通りに行なうとできました。
元々、どなたでも最初に考えられると思いますが"net file"コマンドをバッチファイルなどに」出力せずにプログラム内にて結果出力を得ようとしていました。
しかし、あんまり見ていませんが さんが提案していただいた方法などを行なって
いただくとわかると思いますが、出力結果が得られません。
内部で結果がでないまま、同じコマンド(net file)が何度も繰り返し行なわれて
いるようでフリーズしたようになります。
下記のようなバッチファイルを作って実行していただいてもわかると思いますが
結果が表示されなかったため、"net"コマンドそのものが特殊なものであるため
別の処理が必要だと思っていました。
実際、WMIなどでは処理できないようなので同じとはいえないと思いますが。
バッチファイルによるファイル出力も試していたのですが、私の開発環境が少し
おかしくなっていたようです。
今回の最終目的は、共有フォルダ監視ソフトを作成する事です。
ファイル出力と読込によって、処理が遅くなるとは思いますが目的の事ができそうなので
これで解決とさせていただきます。
みなさん、ささ さん、ありがとうございました。
下記のようなバッチファイル を記載し忘れていました。
net file
pause
上記では表示されません。
パイプでも「一覧にエントリが存在しません」を取得できました。
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;
(ノ゜○゜)ノお〜〜
Dさん、ありがとうございます!
サーバーにて共有ファイルなどの情報が取得できることを確認しました。
フリーやシェアなどの動作が重いなど、良いものがありませんでしたので
負荷をあまりかけない必要な監視ソフトが作成できそうです。
ご回答いただいたみなさん、ありがとうございました。
ツイート | ![]() |