我有一个早上运行的“设置”脚本,它启动了我需要的所有程序。现在其中一些需要额外设置环境,所以我需要将它们包装在小型 BAT 脚本中。
如何在 Windows XP 后台运行这样的脚本?
CALL env-script.bat
同步运行,即设置脚本只有在 env-script 中的命令终止后才能继续运行。
START/B env-script.bat
在同一命令提示符下运行另一个 CMD.exe 实例,使其处于非常混乱的状态(我看到嵌套 CMD.exe 的输出,键盘有一段时间死了,脚本没有执行)。
START/B CMD env-script.bat
产生相同的结果。 CMD 中的所有标志似乎都与我的账单不符。
两岁,但为了完整......
标准内联方法:(即在 Linux 中使用 &
时的行为)
START /B CMD /C CALL "foo.bat" [args [...]]
注意: 1. CALL
与 .bat 文件配对,因为它通常放在哪里..(即这只是 CMD /C CALL "foo.bat"
表单的扩展,使其异步。通常,它需要正确获取退出代码,但这在这里不是问题。); 2. .bat 文件只有在名称包含空格时才需要双引号。 (名称可能是一条路径,在这种情况下更有可能发生这种情况。)。
如果您不想要输出:
START /B CMD /C CALL "foo.bat" [args [...]] >NUL 2>&1
如果您希望 bat 在独立的控制台上运行:(即另一个窗口)
START CMD /C CALL "foo.bat" [args [...]]
如果您希望其他窗口在之后挂起:
START CMD /K CALL "foo.bat" [args [...]]
注意:这实际上是一种糟糕的形式,除非您有用户特别想将打开的窗口用作普通控制台。如果您只是想让窗口停留在附近以查看输出,最好在 bat 文件的末尾放置一个 PAUSE
。甚至,在命令行之后添加 ^& PAUSE
:
START CMD /C CALL "foo.bat" [args [...]] ^& PAUSE
实际上,以下内容对我来说很好,并创建了新窗口:
测试.cmd:
@echo off
start test2.cmd
start test3.cmd
echo Foo
pause
test2.cmd
@echo off
echo Test 2
pause
exit
test3.cmd
@echo off
echo Test 3
pause
exit
将其与 start
的参数(例如 /min
)结合起来,正如 Moshe 指出的那样,如果您不希望新窗口出现在您面前。
由于 START 是从 CMD 脚本在后台执行某些操作的唯一方法,因此我建议您继续使用它。而不是 /B 修饰符,尝试 /MIN 这样新创建的窗口就不会打扰您。此外,您可以使用 /LOW 或 /BELOWNORMAL 将优先级设置为较低的值,这应该会提高您的系统响应能力。
除了前景/背景术语。隐藏正在运行的窗口的另一种方法是通过 vbscript,如果在您的系统中仍然可用。
DIM objShell
set objShell=wscript.createObject("wscript.shell")
iReturn=objShell.Run("yourcommand.exe", 0, TRUE)
将其命名为 sth.vbs 并从 bat 中调用它,放入已调度的任务等。就我个人而言,我将在我管理的任何 Windows 系统上毫不犹豫地禁用 vbs :)
最后使用此选项实际上很容易:
c:\start BATCH.bat -WindowStyle 隐藏
start
没有 -WindowStyle
选项。
C:` instead of
C:\Windows`) 表明他在 Internet 上的某个地方找到了一个工具并复制到了他的硬盘上。
创建一个新的 C# Windows 应用程序并从 main 调用此方法:
public static void RunBatchFile(string filename)
{
Process process = new Process();
process.StartInfo.FileName = filename;
// suppress output (command window still gets created)
process.StartInfo.Arguments = "> NULL";
process.Start();
process.WaitForExit();
}
这适用于我的 Windows XP Home 安装,Unix 方式:
call notepad.exe &
&
是“然后”(术语?)运算符。 (例如cmd1 & cmd2
表示先执行“cmd1”,然后执行“cmd2”。与&&
运算符不同,“cmd2”的执行不依赖于“cmd1”的成功退出。)^
转义了 {1以便它进入 CMD 的参数,而不是被运行 START 的同一控制台消耗和运行。start
和cmd
的其他指南没有提供我所寻求的全部功能。你的回答很到位。START /B "" CMD /C "foo.bat" [args [...]] ^>nul 2^>^&1
START /B "" CMD /C PING 127.0.0.1 >NUL
似乎无论如何都可以工作,并且没有任何输出。 (可能是因为CMD
继承了START
的 I/O 句柄。)我想不同之处在于您是否想保持START
的(错误)输出完好无损,这可能是个好主意。CALL
之所以存在,是因为我觉得保留它是一个很好的做法。 (即,不将CALL
用于 同步 bat 调用将导致不可预知的退出代码,因此我始终将 bat 调用与CALL
配对,即使它并不严格适用,例如在这种情况下。 )