Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Powershell写入一个文件,然后从C读取#_C#_File_Powershell - Fatal编程技术网

C# 从Powershell写入一个文件,然后从C读取#

C# 从Powershell写入一个文件,然后从C读取#,c#,file,powershell,C#,File,Powershell,我从C#调用Powershell来收集一些信息,并使用Out文件将其发送到文本文件。然后,我需要读取上述文件中的行,并处理C#中的数据 所以当它试图打开文本文件时,我得到一个 “找不到文件” 例外。文件每次都被写入,因此我假设有一个定时事件,这就是我使用WaitForExit的原因。但是它仍然无法“找到”文件。为什么不用C#而不是PowerShell编写文件 您可以利用Diagnostics.Process.NET类(这里是一个PowerShell示例) 为什么不用C#而不是PowerShell

我从C#调用Powershell来收集一些信息,并使用Out文件将其发送到文本文件。然后,我需要读取上述文件中的行,并处理C#中的数据

所以当它试图打开文本文件时,我得到一个

“找不到文件”


例外。文件每次都被写入,因此我假设有一个定时事件,这就是我使用
WaitForExit
的原因。但是它仍然无法“找到”文件。

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

您可以利用Diagnostics.Process.NET类(这里是一个PowerShell示例)


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

您可以利用Diagnostics.Process.NET类(这里是一个PowerShell示例)


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

  • 在MyProcess.WaitForExit()之后 添加文件存在性的测试

    if (File.Exists(@"C:\Myfile.txt"))
    {
        ... file process code here....
    }
    
  • 去掉硬编码的文件名,改用变量

    字符串文件名=@“C:\MyFile.txt”

    string MyCommand=“-Command&{get process | Out File”&filename& "}";

  • 然后,当您要访问文件时,请使用:

    if (File.Exists(filename))
    {
       ...process the file.
    }
    
    这样做的好处是,您可以100%保证在所有位置使用完全相同的文件名

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

    嗯,,
    约翰

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

  • 在MyProcess.WaitForExit()之后 添加文件存在性的测试

    if (File.Exists(@"C:\Myfile.txt"))
    {
        ... file process code here....
    }
    
  • 去掉硬编码的文件名,改用变量

    字符串文件名=@“C:\MyFile.txt”

    string MyCommand=“-Command&{get process | Out File”&filename& "}";

  • 然后,当您要访问文件时,请使用:

    if (File.Exists(filename))
    {
       ...process the file.
    }
    
    这样做的好处是,您可以100%保证在所有位置使用完全相同的文件名

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

    嗯,, 约翰

    你好!

    您可以尝试这样做:

    也许对你有帮助

    你好!

    您可以尝试这样做:

    也许对你有帮助


    您确定您有
    C:
    的写入权限并且文件已写入吗?由于直接写入
    C:
    时引发的
    UnauthorizedAccessException
    ,我对此表示怀疑。使用MyProcInfo.UseShellExecute=false;MyProcInfo.RedirectStandardOutput=true,然后将该输出重定向到
    字符串
    ,查看问题所在<代码>而(!MyProcess.StandardOutput.EndOfStream)包含
    MyProcess.StandardOutput.ReadLine()应该可以。请注意:Powershell端正在工作。文件确实会被写入…实际上每次测试时我都会手动删除它。所以我确实有C:\的写权限。当我访问File.ReadLines时遇到问题。那是我得到文件的时候Found@wOxxOm如果您不打算进行替换,那么实际上应该使用单引号字符串文字。我同意@Janesabouchleich。您的代码给了我相同的异常,除非我写入/读取子目录(C:\temp\MyFile.txt)。你说文件已经被写入了,但我对此表示怀疑,因为你的代码除了文件路径之外,对我来说是正常工作的。你是否检查了C:\并看到文件确实存在?Windows会自动重新定向文件夹,您的C:\write可能已重定向到
    %localappdata%\VirtualStore
    。如果从资源管理器查看时文件在那里,那么该文件的文件权限是什么?您确定您有
    C:
    的写入权限并且该文件已写入吗?由于直接写入
    C:
    时引发的
    UnauthorizedAccessException
    ,我对此表示怀疑。使用MyProcInfo.UseShellExecute=false;MyProcInfo.RedirectStandardOutput=true
    ,然后将该输出重定向到
    字符串
    ,查看问题所在<代码>而(!MyProcess.StandardOutput.EndOfStream)包含
    MyProcess.StandardOutput.ReadLine()应该可以。请注意:Powershell端正在工作。文件确实会被写入…实际上每次测试时我都会手动删除它。所以我确实有C:\的写权限。当我访问File.ReadLines时遇到问题。那是我得到文件的时候Found@wOxxOm如果您不打算进行替换,那么实际上应该使用单引号字符串文字。我同意@Janesabouchleich。您的代码给了我相同的异常,除非我写入/读取子目录(C:\temp\MyFile.txt)。你说文件会被写下来,但我怀疑是因为
    
    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();
    }
            }