126

我知道我已经回答了一个类似的问题(Windows 启动时在后台运行批处理文件),但是这次我需要启动一个批处理:

  • 从另一批,
  • 没有显示任何控制台窗口,
  • 将所有参数传递给不可见的批处理。

第一批在控制台窗口中执行。但是,我不希望第二批(由第一批以异步方式启动)也显示控制台窗口。

我想出了一个 VBScript 脚本,它就是这样做的,我把这个脚本作为其他人参考的答案,但如果你有其他想法/解决方案,请随时贡献。

注意:Windows 命令处理器的控制台窗口被很多人命名为不正确的 DOS 窗口。


谢谢大家的回答。据我了解,如果我需要异步调用脚本以在不可见模式下运行:

  • 从已经在控制台窗口中的第二个脚本中,start /b就足够了。
  • 在 Windows 中,在不触发第二个窗口的情况下,我的解决方案仍然有效。
4

10 回答 10

112

这是一个可能的解决方案:

从您的第一个脚本中,使用以下行调用您的第二个脚本:

wscript.exe invis.vbs run.bat %*

实际上,您正在调用一个 vbs 脚本:

  • 你的脚本的 [path]\name
  • 脚本所需的所有其他参数 ( %*)

然后,invis.vbs 将使用Windows Script Host Run() 方法调用您的脚本,该方法需要:

  • intWindowStyle : 0 表示“不可见的窗口”
  • bWaitOnReturn : false 表示您的第一个脚本不需要等待您的第二个脚本完成

这是 invis.vbs:

set args = WScript.Arguments
num = args.Count

if num = 0 then
    WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat <some script arguments>"
    WScript.Quit 1
end if

sargs = ""
if num > 1 then
    sargs = " "
    for k = 1 to num - 1
        anArg = args.Item(k)
        sargs = sargs & anArg & " "
    next
end if

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run """" & WScript.Arguments(0) & """" & sargs, 0, False
于 2008-11-18T12:05:40.857 回答
55

你需要第二个批处理文件来异步运行吗?通常,一个批处理文件与命令同步运行另一个批处理文件call,第二个批处理文件将共享第一个批处理文件的窗口。

可以使用start /b second.bat从您的第一个同步启动第二个批处理文件,该文件共享您的第一个窗口。如果两个批处理文件同时写入控制台,则输出将重叠并且可能难以辨认。此外,您需要exit在第二个批处理文件的末尾放置一个命令,或者cmd一旦一切完成,您将在第二个 shell 中。

于 2008-11-18T12:48:48.130 回答
12

将批处理文件转换为 exe。尝试Bat To Exe ConverterOnline Bat To Exe Converter,然后选择将其作为幽灵应用程序运行的选项,即无窗口。

于 2008-11-18T14:26:23.833 回答
9

我认为这是在不打开 DOS 窗口的情况下运行批处理文件的最简单和最短的解决方案,当您想要安排一组命令定期运行时,它可能会非常分散注意力,因此 DOS 窗口不断弹出,这是您的解决方案. 使用 VBS 脚本调用批处理文件...

Set WshShell = CreateObject("WScript.Shell" ) 
WshShell.Run chr(34) & "C:\Batch Files\ mycommands.bat" & Chr(34), 0 
Set WshShell = Nothing 

将上面的行复制到编辑器并使用 .VBS 扩展名保存文件。相应地编辑 .BAT 文件名和路径。

于 2014-01-15T06:17:16.197 回答
7

对于自我隐藏,您可以使用getCmdPID.batwindowMode.bat

@echo off

echo --- self hiding bat ----
pause
call getCmdPid.bat
set PID=%errorlevel%
call windowMode.bat -pid %PID% -mode hidden

这是我实现这一目标的方法集合 - 甚至更多 - 我可能尝试返回已启动进程的 PID(所有链接的脚本都可以下载并以您认为方便的任何名称保存):

  1. IEXPRESS解决方案甚至可以在旧的 win 95/98 机器上使用。Iexpress 是一个非常古老的工具,仍然与 Windows 一起打包 - 因为参数只接受命令及其参数。

示例用法:

call IEXPhidden.bat "cmd /c myBat.bat"  "argument"
  1. SCHTASKS - 再次只接受两个参数 - 命令和参数。还检查它是否以提升的权限启动,如果可能,使用 WEVTUTIL 获取进程的 PID(可从 Vista 及更高版本获得,因此较新版本的 windows 将接收 PID)命令。

示例用法:

call SCHPhidden.bat "cmd /c myBat.bat"  "argument"
  1. 'WScript.Shell' - 脚本是 'WScript.Shell' 的完整包装,每个可能的选项都可以通过命令行选项设置。它是 jscript/batch 混合体,可以称为 bat。

示例用法(有关更多信息,请使用“-h”打印帮助):

call ShellRunJS.bat "notepad.exe" -style 0 -wait no 
  1. 'Win32_ProcessStartup' - 再次完整的包装器和所有选项都可以通过命令行参数访问。这次它是 WSF/批处理混合了一些 Jscript 和一些 VBScript 代码片段 - 但它返回已启动进程的 PID。如果进程没有隐藏可以使用一些选项,如 X/Y 坐标(不适用于每个可执行文件 - 但例如 cmd.exe 接受坐标)。

示例用法(有关更多信息,请使用“-h”打印帮助):

call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindows 0 -title "notepad"
  1. 这 。网络解决方案。ProcessStartInfo选项的大部分选项都使用了(但最后我太累了,无法包含所有内容):

示例用法(有关更多信息,请使用“-h”打印帮助):

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal
于 2015-10-15T15:21:52.240 回答
3

在不同的用户名下运行它,使用“runas”或通过在 Windows 计划任务中的不同用户下安排它。

于 2008-11-18T14:40:09.077 回答
2

在另一个问题中,我建议使用 autoexnt。在这种情况下也是可能的。只需将服务设置为手动运行(即在启动时不自动运行)。当您要运行批处理时,修改 autoexnt.bat 文件以调用所需的批处理文件,然后启动 autoexnt 服务。

启动它的批处理文件看起来像这样(未经测试):

echo call c:\path\to\batch.cmd %* > c:\windows\system32\autoexnt.bat
net start autoexnt

请注意,以这种方式启动的批处理文件以系统用户身份运行,这意味着您无法自动访问网络共享。但是您可以使用net use连接到远程服务器。

您必须下载 Windows 2003 Resource Kit才能获得它。Resource Kit 也可以安装在其他版本的 Windows 上,例如 Windows XP。

于 2008-11-18T13:15:31.387 回答
2

我知道这已经有了答案,但如果有人偶然发现这个问题,这可能会有所帮助:

这是在后台完全运行它的好方法,没有任何方法可以看到它。您可以与之交互的唯一方法是使用 taskmgr 或 Process Hacker 终止它。

这使用了一个名为 NirCmd 的第三方工具。

  1. 制作一个包含以下代码的脚本:
@echo off
nircmd exec hide "MainScript.bat"
  1. 将其保存为您喜欢的任何内容。“MainScript.bat”可以是任何东西,但请稍后注意。

  2. 现在,使用您之前记下的名称制作另一个脚本。例如,我将其命名为 MainScript.bat 并为其提供以下代码:

@echo off
echo Can you see me now?
pause 
exit
  1. 这将是您要在后台执行的代码。

  2. 确保它们在同一目录中,并将 NirCmd 下载到同一目录中。

以下是这些脚本的结果:

演示 GIF

NirCmd 下载链接

演示 ZIP 文件

注意:NirCmd 不是我的工具,但它仍然有用。

于 2021-07-04T13:49:48.673 回答
0

您可以通过 .vbs 文件运行 .bat 文件
将以下代码复制到 .vbs 文件中:

Dim WshShell
Dim obj
Set WshShell = WScript.CreateObject("WScript.Shell") 
obj = WshShell.Run("C:\Users\file1.bat", 0) 
obj = WshShell.Run("C:\Users\file2.bat", 0)  and so on
set WshShell = Nothing 
于 2014-01-31T12:57:33.527 回答
0

你也可以使用

start /MIN notepad.exe

PS:不幸的是,最小化的窗口状态取决于要运行的命令。VG 不工作

start /MIN calc.exe
于 2019-03-13T13:10:31.043 回答