从Powershell写一个文件然后从C#中读取它

时间:2017-07-18 21:02:37

标签: c# file powershell

我从C#调用Powershell来收集一些信息并使用Out-File将其发送到文本文件。然后我需要从所述文件中读取行并对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的原因。但它仍然无法找到'文件。

3 个答案:

答案 0 :(得分:1)

为什么不用C#而不是PowerShell编写文件?

您可以利用Diagnostics.Process .NET类(此处为PowerShell示例)

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

答案 1 :(得分:1)

我不能告诉你出了什么问题,但我可以给你一些解决问题的提示。

  1. MyProcess.WaitForExit()之后 为文件的存在添加测试。

    if (File.Exists(@"C:\Myfile.txt"))
    {
        ... file process code here....
    }
    
  2. 取消硬编码的文件名并改为使用变量。

    string filename = @“C:\ MyFile.txt”;

    string MyCommand =“-Command& {get-process | Out-File”&文件名和 “}”;

  3. 然后当你想访问文件时使用:

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

    这样做的好处是,您可以100%保证在所有地方使用完全相同的文件名。

    1. 在MyProcess.WaitForExit()之后添加断点; 然后,当执行停止时,导航到该文件并确保它在那时处于物理状态并确保它未被程序锁定。例如,尝试重命名或删除它。如果它仍然被锁定,你就不应该做任何一件事。此外,大多数当前版本的Windows都有一个可以检查打开文件的位置。如果你告诉我你正在运行什么操作系统,我可能会告诉你如何检查它。
    2. 还有一件事:另一张海报提到了Windows重定向。当文件明确完全合格时,我个人从未发生过这种情况。

      HTH, 约翰

答案 2 :(得分: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();
}
        }