繁体   English   中英

相当于没有单独参数的Process.Start()

[英]Equivalent to Process.Start() without separate arguments

我正在编写一个运行任意命令所需的简单应用程序,例如:

powershell -File myscript.ps1
cmd /C "ping localhost"

Process.Start()将是完美的,除非它要求将参数作为单独的参数给出。 最初我以为我可以在第一个空格字符上拆分字符串,但是如果引用可执行路径并包含空格怎么办? 是否有类似Process.Start()的东西允许你只给它一个字符串,有或没有参数,只是让它执行它就好像它被粘贴到命令提示符一样?

你为什么不通过cmd / C运行一切?

Process.Start("cmd", "/C " + command);

只需直接调用CreateProcess函数:

public static class Native
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    private struct STARTUPINFO
    {
        public Int32 cb;
        public string lpReserved;
        public string lpDesktop;
        public string lpTitle;
        public Int32 dwX;
        public Int32 dwY;
        public Int32 dwXSize;
        public Int32 dwYSize;
        public Int32 dwXCountChars;
        public Int32 dwYCountChars;
        public Int32 dwFillAttribute;
        public Int32 dwFlags;
        public Int16 wShowWindow;
        public Int16 cbReserved2;
        public IntPtr lpReserved2;
        public IntPtr hStdInput;
        public IntPtr hStdOutput;
        public IntPtr hStdError;
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct PROCESS_INFORMATION
    {
        public IntPtr hProcess;
        public IntPtr hThread;
        public int dwProcessId;
        public int dwThreadId;
    }

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    private static extern bool CreateProcess(
        string lpApplicationName,
        string lpCommandLine,
        IntPtr lpProcessAttributes,
        IntPtr lpThreadAttributes,
        bool bInheritHandles,
        uint dwCreationFlags,
        IntPtr lpEnvironment,
        string lpCurrentDirectory,
        [In] ref STARTUPINFO lpStartupInfo,
        out PROCESS_INFORMATION lpProcessInformation);

    public static void CreateProcessFromCommandLine(string commandLine)
    {
        var si = new STARTUPINFO();
        var pi = new PROCESS_INFORMATION();

        CreateProcess(
            null,
            commandLine,
            IntPtr.Zero,
            IntPtr.Zero,
            false,
            0,
            IntPtr.Zero,
            null,
            ref si,
            out pi);
    }
}

internal class Program
{
    public static void Main()
    {
        Native.CreateProcessFromCommandLine("ping google.com -t");

        Console.Read();
    }
}

您可以使用Path类来评估命令行字符串并像这样运行Process.Start

// This is our command string
var cmd = @"C:\Program Files\Sub folder 1\executable name.exe -arg1 -arg2 -argN"; 

var exeName = Path.GetFileName(cmd); // "executable name.exe -arg1 -arg2 -argN"

var borderPos = exeName.IndexOf(".exe") // or .cmd, .bat, etc.
borderPos = borderPos == -1 ? exeName.IndexOf(" ") : borderPos + 4;

var arguments = exeName.Substring(borderPos).Trim();
var program = cmd.Substring(0, cmd.Length - arguments.Length);

Process.Start(program, aguments);

像这样的东西应该这样做,但上面的代码是未经测试的......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM