如何在Windows上的后台运行命令?

时间:2014-01-09 21:08:53

标签: windows

在linux中,您可以使用命令 & 在后台运行命令,在shell脱机后也会继续运行。我想知道是否有类似于Windows的东西......

5 个答案:

答案 0 :(得分:36)

我相信你要找的命令是start /b *command*

对于unix,nohup代表'没有挂断',这与后台作业(*command* &略有不同。我相信上面的命令应该类似于windows的后台作业

答案 1 :(得分:11)

我假设您要做的是运行没有接口的命令(可能是自动的?)。在Windows上有许多选项供您查找:

  • 最佳:将您的程序编写为Windows服务。这些将在没有人登录服务器时启动。它们允许您选择用户帐户(可能与您自己的帐户不同),如果失败则会重新启动。它们始终运行,因此您可以在特定时间或在其中定期自动执行任务。有关如何编写Windows服务的更多信息,您可以在线阅读教程,例如(http://msdn.microsoft.com/en-us/library/zt39148a(v=vs.110).aspx)。

  • 更好:启动命令并隐藏窗口。假设该命令是DOS命令,您可以使用VB或C#脚本。有关详细信息,请参阅here。一个例子是:

    Set objShell = WScript.CreateObject("WScript.Shell")
    objShell.Run("C:\yourbatch.bat"), 0, True
    

    您仍然需要手动启动命令或编写任务以启动命令。这是该战略中最大的下降之一。

  • 最差:使用启动文件夹启动命令。这在用户登录计算机时运行

希望有所帮助!

答案 2 :(得分:3)

您还应该查看Windows中的at命令。它将在后台的某个时间启动一个程序,在这种情况下工作。

另一种选择是使用nssm服务管理器软件。这将包装您作为Windows服务运行的任何命令。

更新:

nssm并不是很好。你应该看看WinSW项目。 https://github.com/kohsuke/winsw

答案 3 :(得分:1)

如果您花 5 分钟下载 Visual Studio 并为此制作一个控制台应用程序,那么您的问题就解决了。

using System;
using System.Linq;
using System.Diagnostics;
using System.IO;

namespace BgRunner
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Starting: " + String.Join(" ", args));
            String arguments = String.Join(" ", args.Skip(1).ToArray());
            String command = args[0];

            Process p = new Process();
            p.StartInfo = new ProcessStartInfo(command);
            p.StartInfo.Arguments = arguments;
            p.StartInfo.WorkingDirectory = Path.GetDirectoryName(command);
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.UseShellExecute = false;
            p.Start();
        }
    }
}

用法示例:

BgRunner.exe php/php-cgi -b 9999
BgRunner.exe redis/redis-server --port 3000
BgRunner.exe nginx/nginx

答案 4 :(得分:0)

使用带有start标志的/b命令来运行命令/应用程序,而无需打开新窗口。例如,这在后台运行dotnet run

start /b dotnet run

您也可以将参数传递给命令/应用程序。例如,我正在启动该C#项目的3个实例,其参数值为xyz

enter image description here

要停止在后台运行的程序,请执行以下操作:CTRL + BREAK

以我的经验,这会停止您在该cmd实例中启动的所有后台命令/程序。

根据Microsoft docs

  除非应用程序启用CTRL + C处理,否则将忽略

CTRL + C处理。使用CTRL + BREAK中断应用程序。