我从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
的原因。但它仍然无法找到'文件。
答案 0 :(得分:1)
为什么不用C#而不是PowerShell编写文件?
您可以利用Diagnostics.Process .NET类(此处为PowerShell示例)
$proc = [Diagnostics.Process]::Start($exe, $arguments)
$proc.WaitForExit()
答案 1 :(得分:1)
我不能告诉你出了什么问题,但我可以给你一些解决问题的提示。
MyProcess.WaitForExit()之后 为文件的存在添加测试。
if (File.Exists(@"C:\Myfile.txt"))
{
... file process code here....
}
取消硬编码的文件名并改为使用变量。
string filename = @“C:\ MyFile.txt”;
string MyCommand =“-Command& {get-process | Out-File”&文件名和 “}”;
然后当你想访问文件时使用:
if (File.Exists(filename))
{
...process the file.
}
这样做的好处是,您可以100%保证在所有地方使用完全相同的文件名。
还有一件事:另一张海报提到了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();
}
}