2017-07-18 6 views
0

私はPowershellをC#から呼び出して情報を収集し、Out-Fileを使ってテキストファイルに送ります。次に、私は上記のファイルから行を読んで、C#の中のデータを使って処理する必要があります。それは、テキストファイルを開こうとするとPowershellからファイルを作成してからC#

string MyCommand = "-Command &{ get-process | Out-File C:\\MyFile.txt}"; 

ProcessStartInfo MyProcInfo = new ProcessStartInfo(); 
MyProcInfo.FileName = "powershell.exe"; 
MyProcInfo.Arguments = MyCommand; 

Process MyProcess = new Process(); 
MyProcess.StartInfo = MyProcInfo; 
MyProcess.Start(); 
MyProcess.WaitForExit(); 

try 
{ 
    var lines = File.ReadLines(@"C:\MyFile.txt"); 
    (etc) 
} 
catch (Exception Ex) 
{ 
    MessageBox.Show(Ex.ToString()); 
} 

は、だから私は

例外 "ファイルが見つかりません"

を取得しています。ファイルは、が毎回書かれているので、私は、タイミングの事が起きていると仮定しています。それは、なぜ私がWaitForExitを使用しているのかということです。しかし、それはまだファイルを見つけることができません。

+1

を助けるあなたがC 'への書き込みアクセス権を持っているあなたは確かにあります:'とファイルが書かれていますか? 'C:'に直接書き込むときにスローされる 'UnauthorizedAccessException'のために、私はそれを疑っています。 'MyProcInfo.UseShellExecute = false;を使用してください。 MyProcInfo.RedirectStandardOutput = true; '、その出力を' string'にリダイレクトし、どこに問題があるかを確認します。 'MyProcess.StandardOutput.ReadLine();'を囲む 'while(!MyProcess.StandardOutput.EndOfStream)'はそのトリックを行うべきです。 – jAC

+0

注:Powershell側が動作しています。ファイルは書き込まれます...私は実際にテストするたびに手動で削除します。だから、私はC:\への書き込みアクセス権を持っています。 File.ReadLinesにアクセスすると問題が発生します。それは私がファイルを見つけられなかったときです – PSNewb

+0

@wOxxOm置換を行う予定がない場合は、実際には一重引用符の文字列リテラルを使用してください。 – TheIncorrigible1

答えて

1

PowerShellではなくC#でファイルを書き込まないのはなぜですか?

あなたは、私が間違っている何かを伝えることはできませんが、私はトラブルシューティングするためにあなたにいくつかのヒントを与えることができます

$proc = [Diagnostics.Process]::Start($exe, $arguments) 
$proc.WaitForExit() 
+0

ここにあるPowerShellの行に記載されているものよりもずっと多くのことが起こっています。私はそれを簡潔にするために切り捨てました。しかし、それが実行されるたびに正しく書かれています。 – PSNewb

+1

powershell inprocを呼び出して、ファイルシステムに書き込んだり再読み込みすることなく出力を直接使用することができます。 「https://stackoverflow.com/questions/16398171/powershell-command-through-c-sharp-code」をご覧ください –

1

(ここではPowerShellの例だ)Diagnostics.Process .NETクラスを活用することができます。 MyProcess.WaitForExit後

  1. () は、ファイルの存在のためのテストを追加します。

    if (File.Exists(@"C:\Myfile.txt")) 
    { 
        ... file process code here.... 
    } 
    
  2. ハードコードされたファイル名を取り除き、代わりに変数を使用して取得します。

    文字列ファイル名= @ "C:\ MyFile.txt";

    文字列MyCommand = " - コマンド& {取得プロセス|アウトファイル" &ファイル名& "}"。

    その後、

ファイルの使用をアクセスしたい:

if (File.Exists(filename)) 
{ 
    ...process the file. 
} 

これの利点は、あなたがすべての場所で正確に同じファイル名を使用していることを100%保証されているということです。

  1. MyProcess.WaitForExit()の後にブレークポイントを追加します。 次に、実行が停止したら、そのファイルに移動し、その時点で物理的に物理的に存在することを確認し、プログラムによってロックされていないことを確認します。たとえば、名前を変更したり、削除したりします。それでもロックされていれば、そのようなことをすることはできません。また、現在のWindowsのほとんどのバージョンでは、開いているファイルを確認できる場所があります。あなたが実行しているOSが何であるか教えてくれれば、それを確認する方法を教えてくれるかもしれません。

さらにもう1つのポスターがWindowsリダイレクトを説明しました。ファイルが明示的に完全修飾されていると私は個人的には起こりませんでした。

HTH、 ジョン

0

こんにちは!あなたはこのような何かをしようとすることができます

多分それはあなたのため

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

string MyCommand = "-Command &{ if (!(Test-Path 'c:\\test')) {md 'c:\\test'; get-process | Out-File c:\\test\\MyFile.txt}}"; 

ProcessStartInfo MyProcInfo = new ProcessStartInfo(); 
MyProcInfo.FileName = "powershell.exe"; 
MyProcInfo.Arguments = MyCommand; 

Process MyProcess = new Process(); 
MyProcess.StartInfo = MyProcInfo; 
MyProcess.Start(); 
MyProcess.WaitForExit(); 

try 
{ 
    var lines = File.ReadLines(@"c:\test\MyFile.txt"); 
foreach (var ln in lines) { 
    Console.WriteLine(ln); 
    Console.ReadKey(); 

} 
} 
catch (Exception Ex) 
{ 
    Console.WriteLine(Ex.ToString()); 
    Console.ReadKey(); 
} 
     } 
関連する問題