2017-07-18 120 views
0

我正在從C#調用Powershell來收集一些信息並使用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()); 
} 

因此,當它試圖打開文本文件,我得到一個

「找不到文件」

例外。每次都會寫入文件IS,所以我假設有一個計時事件正在進行,這就是爲什麼我使用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

爲什麼不用C#而不是用PowerShell編寫文件?

您可以利用Diagnostics.Process .NET類(這裏是一個PowerShell的例子)

$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

我不能告訴你什麼是錯的,但我可以給你一些提示,故障排除。

  1. MyProcess.WaitForExit後() 添加一個用於測試的文件是否存在。

    if (File.Exists(@"C:\Myfile.txt")) 
    { 
        ... file process code here.... 
    } 
    
  2. 擺脫硬編碼的文件名並改用變量。

    string filename = @「C:\ MyFile.txt」;

    串mycommand的= 「-Command & {獲取過程|出文件」 & &名 「}」;

然後當你要訪問的文件,請使用:

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

這樣做的好處是,你是100%保證您使用的正是在所有地方相同的文件名。

  1. 在MyProcess.WaitForExit()後添加一個斷點。 然後,當執行停止時,導航到該文件,並確保它在那個時間出現,並確保它未被程序鎖定。例如,嘗試重命名或刪除它。如果它仍然被鎖定,你不應該能夠做這兩件事中的任何一件。此外,大多數當前版本的Windows都有可以檢查打開文件的位置。如果您告訴我您正在運行的操作系統,我可能會告訴您如何檢查該操作系統。

還有一件事:另一張海報提到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(); 
} 
     }