以下代码假设从我的C#应用程序打开CMD并打开文件text.txt。
我尝试将文件路径设置为环境变量,但是当记事本打开时,它会查找%file%.txt而不是text.txt
知道为什么吗?
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents=false;
proc.StartInfo.EnvironmentVariables.Add("file", "c:\\text.txt");
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.FileName = "notepad";
proc.StartInfo.Arguments="%file%";
proc.Start();
proc.WaitForExit();
Console.WriteLine(proc.ExitCode);
答案 0 :(得分:10)
如果您的目的是使用.txt文件启动编辑器(如问题标题所示),请使用:
Process.Start("C:\\text.txt")
答案 1 :(得分:3)
简短版本是我怀疑你必须更直接地传递arg,即
proc.StartInfo.Arguments = @"""c:\text.txt""";
虽然您可以设置环境变量(在过程中使用),但我认为您不能在流程开始时使用它们。
答案 2 :(得分:2)
你想用%file%完成什么? notepad.exe的命令行参数是您要打开的文件。你需要做这样的事情:
proc.StartInfo.Arguments = "c:\\text.txt";
答案 3 :(得分:1)
一个明显的问题是你有UseShellExecute设置为false。这意味着您直接执行记事本而不通过命令shell cmd.exe。因此环境变量没有被扩展。
我不确定您要实现的目标(为什么需要添加环境变量?)但以下内容可行:
System.Diagnostics.Process proc =
new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.EnvironmentVariables.Add("file", "c:\\text.txt");
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.FileName = "cmd.exe";
proc.StartInfo.Arguments = "/c notepad %file%";
proc.Start();
proc.WaitForExit();
答案 4 :(得分:1)
设置UseShellExecute = true
这样它应该使用cmd.exe处理器来扩展%file%变量
答案 5 :(得分:0)
试试这个:
proc.StartInfo.Arguments = System.Environment.GetEnvironmentVariable("file");
答案 6 :(得分:0)
也许它与StartInfo.Arguments的工作方式有关。如果你找不到更好的东西,这对我有用:
proc.StartInfo.FileName = "cmd";
proc.StartInfo.Arguments="/c notepad %my_file%";
答案 7 :(得分:0)
我愿意打赌你需要设置 WorkingDirectory 才能让它发挥作用。 NOTEPAD.exe 通常位于%SYSTEMROOT%(C:\ windows)中,但默认值为%SYSTEMROOT%\ system32 。试试下面的内容。
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents=false;
proc.StartInfo.WorkingDirectory = "%SYSTEMROOT%";
proc.StartInfo.EnvironmentVariables.Add("file", "c:\\text.txt");
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.FileName = "notepad";
proc.StartInfo.Arguments="%file%";
proc.Start();
proc.WaitForExit();
Console.WriteLine(proc.ExitCode);