我将批处理脚本迁移到.Net核心,我试图从当前终端打开另一个终端并运行命令(我不需要stderr o stout)。
批处理只需要此命令:start cmd /K gulp
。我试图用.Net核心做同样的事情,但只找到了在当前终端内运行命令的方法。
private static string Run (){
var result = "";
try
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "cmd.exe";
startInfo.Arguments = $"/c \"gulp browserSync\"";
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
using (Process process = Process.Start(startInfo))
{
result = process.StandardError.ReadToEnd();
process.WaitForExit();
}
}
catch (Exception Ex)
{
Console.WriteLine(Ex.Message);
Console.ReadKey();
}
return result;
}
我尝试更改此属性以便在另一个终端中打开:
startInfo.RedirectStandardOutput = false;
startInfo.RedirectStandardError = false;
startInfo.UseShellExecute = true;
但是例外:
UseShellExecute必须始终设置为false。
答案 0 :(得分:1)
来自MSDN docs:
如果UserName属性不为null或为空字符串,则UseShellExecute必须为false,否则在调用Process.Start(ProcessStartInfo)方法时将抛出InvalidOperationException。
startInfo.UserName = null;
编辑:我不确定你为什么要传递参数,但如果你想要的只是一个新的CMD窗口,试试这个:
try
{
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "cmd.exe",
WorkingDirectory = @"C:/users/replace/where_gulp_is_located",
Arguments = @"/c gulp", // add /K if its required, I don't know if its for gulp for to open a new cmd window
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true
};
Process proc = new Process();
proc.StartInfo = startInfo;
proc.Start();
if (showOut)
{ ///code }
}catch(Exception ex)
{
Console.WriteLine(ex);
}
在这种情况下,您不需要startInfo.UserName
,因为您正在指定工作目录。
答案 1 :(得分:1)
感谢@ bender-bending的回答,我找到了解决问题的方法。由于安全限制需要用户/密码凭证才能使当前终端自动打开新的终端。
需要WorkingDirectory,用户,密码和域名 不创建窗口,重定向输出和重定向错误必须为false,以便在新窗口中查看命令结果。
public static void Sample(){
try
{
Console.Write("Password: ");
StringBuilder password = new StringBuilder();
while (true)
{
var key = System.Console.ReadKey(true);
if (key.Key == ConsoleKey.Enter) break;
password.Append(key.KeyChar);
}
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "cmd.exe",
WorkingDirectory = "C:/path_to/Gulp",
Arguments = $"/c \"gulp browserSync\"",
UseShellExecute = false,
RedirectStandardOutput = false,
RedirectStandardError = false,
UserName = Machine.User(),
PasswordInClearText = password.ToString(),
Domain = Machine.Domain(),
CreateNoWindow = false
};
Process proc = new Process();
proc.StartInfo = startInfo;
proc.Start();
//proc.WaitForExit();
} catch (Exception ex)
{
System.Console.WriteLine(ex);
System.Console.ReadKey();
}
}
.Net Core没有获取用户和域的方法。我们可以使用这个类从环境变量中获取这些值。
public static class Machine
{
public static string User(){
return Environment.GetEnvironmentVariable("USERNAME") ?? Environment.GetEnvironmentVariable("USER");
}
public static string Domain(){
return Environment.GetEnvironmentVariable("USERDOMAIN") ?? Environment.GetEnvironmentVariable("HOSTNAME");
}
}
希望它有所帮助!