以完全隐藏的方式运行批处理文件


139

我正在寻找某种方式来运行批处理文件(.bat),而用户看不到任何东西(没有窗口,没有任务栏名称,等等)。

我不想使用某些程序来执行此操作,我正在寻找更清洁的工具。我已经找到使用VBScript 的解决方案,但我也不太喜欢使用VBS。


哈哈!当然不。我正在开发Windows服务,该服务将不时运行批处理文件。
Moayad Mardini

4
Windows服务不能作为批处理文件运行。它们作为服务运行。您需要澄清问题,无论是书面形式还是带有评论,对我来说都是没有意义的。
Carf 2009年

1
我有一个运行批处理文件的Windows服务。并非该服务是批处理文件。
Moayad Mardini

1
您用什么语言编写服务?
休·艾伦,2009年

也有hstart。
barlop

Answers:


119

解决方案1:

将这一行文本另存为file invisible.vbs

CreateObject(“ Wscript.Shell”)。Run“”“”&WScript.Arguments(0)&“”“”,0,False

要隐式运行任何程序或批处理文件,请按以下方式使用它:

wscript.exe“ C:\ Weverever \ invisible.vbs”“ C:\ Some Other Place \ MyBatchFile.bat”

为了也可以传递/中继参数列表,请仅使用两个双引号

CreateObject(“ Wscript.Shell”)。运行“”&WScript.Arguments(0)&“”,0,否

例: Invisible.vbs "Kill.vbs ME.exe"

解决方案2:

使用命令行工具以静默方式启动进程:Quiethideconhideexec


2
为什么用双引号4个,请您解释一下?
Starx 2011年

如果我们需要启动隐藏程序怎么办?
Starx 2011年

5
@Starx VB语法。&表示连接字符串。字符串用双引号(")括起来。""字符串定界符中的连续双引号()表示文字双引号(")。因此,四个双引号("""")将是一个字符的字符串文字,即双引号(")。将其放在一起,"""" & WScript.Arguments(0) & """"将变为"<argument>",这<argument>是传递给脚本的第一个命令行参数。
鲍勃

4
如何修改它以便传递所有参数?传递参数而不引用它们会更方便。
Ctrl-C

2
这是否还不需要您创建一个批处理文件以将其wscript.exe "C:\Wherever\invisible.vbs" ...放入其中?
endlith's

26

隐藏批处理文件或命令文件或任何文件。...使用Windows XP内置IExpress.exe实用程序从批处理文件中生成.EXE。使用时,请IExpress确保选中“运行隐藏”选项并选中所有不显示任何内容的复选框。创建.exe后,将其放在您选择的任何运行命令文件夹中,您将永远不会看到它。


1
哦,实际上是好的解决方案。
卡米洛·马丁

7
在Windows 7等较新的Windows版本中,有什么与lexpress.exe等效的东西?
Sнаđошƒаӽ

@Sнаđошƒаӽ它在Windows 7中。...刚刚测试过
DarthRubik

@DarthRubik感谢您的分享。我也对其进行了测试,并且效果很好。是时候投票给答案了。:)
Sнаđошƒаӽ

这似乎在Windows 10 64上不起作用,因为“ Command.com”似乎不再存在
Arne S

10

使用Cmdow是用于NT4 / 2000 / XP / 2003的Win32命令行实用工具,它允许列出,移动,调整大小,重命名,隐藏/隐藏,禁用/启用,最小化,最大化,还原,激活/非激活,关闭,终止和关闭窗口更多。

运行一个隐藏的批处理文件,并为其传递参数:-

cmdow / run / hid mybat arg1“ arg 2”


但是我将如何运行该命令?
2009年

9
大多数防病毒产品都将cmdow检测为恶意软件。因此,很难在您自己的PC以外的其他地方使用此解决方案。
Ganesh R.

@Ganesh:还有更好的解决方案吗?
Moayad Mardini

它是开源的吗?使用非开源的第三方应用程序毫无意义,当您可以通过运行harrymc的1行vbscript进行相同的操作时,它可以打包木马(请参阅他在线程顶部的回答)。
thebunnyrules

1
好吧,它是开源的,因此非常棒。可以在这里获取源代码:github.com/ritchielawrence/cmdow
thebunnyrules

9

如果您的批处理文件可以容纳一行并且包含许多字符,则只需使用快捷方式,方法是右键单击随机目录中的文件夹,然后跳过向导的其余部分,最后右键单击刚刚创建的快捷方式,单击属性,然后在目标下,输入通常放在bat文件中的内容。和鲍伯你的叔叔!

优点:

 No Command Window
 Ability to use an icon
 Same Functionality of bat file

缺点:

 Limited to one line, so many characters

唯一的问题是您不能将文件类型与快捷方式关联。因此,如果要通过在资源管理器中双击打开带有批处理脚本的脚本,则仍需要一个.bat文件。
比昂·林德奎斯特

我仍在寻找鲍勃叔叔,在任何地方!
皮条客果汁IT

7

通过at作业运行脚本,而无需使其交互:

at 11:00 script.bat

另一个解决方案是,如果您不介意安装Python之类的东西,则可以简单地创建一个脚本并运行它pythonw(GUI操作的链接版本)。由于您未使用任何图形API,因此不会显示该窗口。只需使用对的调用os.system(),它将模仿批处理脚本,因为它与在命令行中键入字符串相同。

例:

import os

os.system("tasklist > C:\tasks.txt")
os.system("ipconfig /all > C:\netinfo.log")

3
但是我将如何运行该命令?
Moayad Mardini

您将必须安排计划的任务或编写服务。
Unfundednut

添加示例。
约翰·T


6

使用Windows7,您可以使用“计划任务”控制面板来计划批处理文件,使其以指定的权限甚至以“ SYSTEM”帐户身份在后台运行。请参见下面的屏幕截图:

在此处输入图片说明

此外,尽管功能不那么多,但是您也可以使用“ AT.exe”命令从命令行创建不可见的批处理脚本任务,而无需使用“ / interactive”选项。


3
“隐藏”复选框只是从“任务计划程序”用户界面中隐藏任务(
Sourav Ghosh

当不需要“ SYSTEM”特权(并且没有针对安全性漏洞进行检查和强化)时,以“ SYSTEM”身份运行任务是一个坏主意;在这里查看评论
斯科特(Scott)

6

我不喜欢VBScript解决方案。

下载nircmd.exe并将其复制到您的%systemroot%\system32文件夹,然后将此命令添加到批处理的第一行:

nircmd.exe win hide ititle "cmd.exe"

或先使用title命令自定义批次标题,以避免隐藏所有cmd窗口,如下所示:

title MyBatch
nircmd.exe win hide ititle "MyBatch"

我使用了这种确切的方法,但是有一段时间失败了,nircmd不会隐藏cmd窗口,只是最小化到任务栏,并且无法通过单击来恢复。不知道为什么...
杨景


3

您还可以创建一个AutoHotkey脚本:

#NoTrayIcon ; To prevent momentary icon pop-up
run whatever.bat arg1 arg2,,hide 

3

从C / C ++开始的另一种方式是使用带有CREATE_NO_WINDOW标志的CreateProcess函数。它具有许多此处未显示的额外功能。这只是替换system()或_spawn()系列的最低要求。

STARTUPINFO si;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);

PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof(pi) );

// Spawn creates a cmd.exe window.  CreateProcess doesn't.
//if ( _spawnl( _P_WAIT, szFileNameBAT, szFileNameBAT, NULL ) ) {  
if ( !CreateProcess( szFileNameBAT, szFileNameBAT, NULL, NULL, false,
                     CREATE_NO_WINDOW, NULL, NULL, &si, &pi  ) ) {
  MyErrorFunc( "CreateProcess( \"%s\" ): %d", szFileNameBAT, GetLastError() );
  goto MyErrorHandling;
}

WaitForSingleObject( pi.hProcess, INFINITE );

CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );

1
WINAPI方法的正确答案。这是源代码和应用程​​序,可作为您答案的补充。
亚历克斯

3

出色的Bat To Exe Converter会将您的.bat.cmd文件转换为.exe文件。

它有一个简单的用户界面。您可以通过选择“不可见的应用程序”选项来选择不具有控制台窗口。此外,它还允许您分配图标,与程序包相关的文件以及其他几个选项。

这是主界面窗口的屏幕截图:


请注意,该图像已过期。它显示了版本2.4.8,并且自2018年9月起,该网站提供版本3.0.10.0(最新更新为2018-03-23)。

警告:www.f2ko.de网站链接到coinhive.com,它被广泛 认为 恶意软件


2

我用nircmd成功做到了

  1. 链接下载nircmd.exe
  2. 创建您的.bat文件
  3. .bat文件的第一行必须是这样的: nircmd.exe win hide ititle "cmd.exe"
  4. 选择两个文件并使用winrar创建一个自解压文件
  5. 在“常规”标签中,选中“创建自动提取文件”框
  6. 在“高级”选项卡中,选择“自动提取”按钮
  7. 有一个新窗口,然后选择“模式”选项卡,然后选择选项:“隐藏所有内容”
  8. 选择选项卡“更新”,然后选择选项“覆盖现有文件”
  9. 如果需要,选择“常规”选项卡并定义要提取的目标文件夹,然后在“提取后执行”框中,输入将提取.bat的完整路径。例如:如果您将提取文件夹定义为:“ c:\ windows \”,则提取后要执行的完整路径将是:“ c:\ windows \ file.bat”(如果您的.bat名为:file.bat )
  10. 在所有窗口上单击接受

现在,您将拥有一个.exe文件,只需双击并安装它,您的.bat文件将完全隐藏。



1

您不需要做任何特别的事情。

如果从Windows服务运行批处理文件,则默认情况下应将其隐藏,除非您在该服务上启用了“允许服务与桌面交互”选项。


1

由于这是重复的文章,我在另一篇文章中添加了我的答案,在这里我看不到此解决方案,因此对于如何运行隐藏的批处理文件,现在有17种不同的答案。我将在不久的将来删除关于该帖子的答案。

使用批处理逻辑和命令创建批处理脚本,然后创建具有.VBS扩展名的新文件,使用以下逻辑(下面提供的示例),并使用等命令插入您.CMD.BAT文件的完整路径PING -t <IPAddress>,因此它以隐藏方式执行批处理,而不在执行时显示命令窗口。

下面的示例中的逻辑指定了C:\Folder\BatchFileName.cmd更改,以指向您现在正在手动运行的命令等批处理脚本。

保存.VBS文件并使用“ Task Scheduler 在Windows7计划任务以不确定的时间表运行以满足您的需求”中的问题进行计划

否则,只需双击该.VBS文件即可运行PING您在批处理文件中输入的无限命令(将其指向需要的地方)。

注意: 我相信这是我从中获得此脚本逻辑的地方,但是它可以可靠地工作,以达到您在此处需要的相同目的,即确保在运行批处理文件时隐藏命令窗口。服务器故障源

隐藏CMD窗口的示例VBS脚本运行命令行批处理

Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Folder\BatchFileName.cmd" & Chr(34), 0
Set WinScriptHost = Nothing

1

在这里,我已经编译了所有已知的方法,无需使用外部工具即可使用批处理启动隐藏进程。使用现成的脚本(其中一些脚本具有丰富的选项),并且所有脚本都形成命令行。 PID返回。使用的工具是IEXPRESS,SCHTASKS,WScript.Shell,Win32_Process和JScript.Net


1

尽管我已经回答了这,但这是另一种方法。不同的下面是批处理脚本可以自动隐藏自身在它的run.You'll需要两个额外的脚本虽然- windowMode.batgetCMDPid.bat(两者都含.net代码)。那么如何使用:

@echo off
call getCmdPid
call windowMode -pid %errorlevel% -mode hidden

echo this should be written into log despite the cmd window is hidden>log
echo ending the log>>log
exit


0

我开始尝试弄清楚这一点,但从未真正成功。这和我得到的差不多:

@echo off
if not defined PIL (
    set PIL=1
    start /min "" %~0
    exit /b
)
TITLE Hello World
echo Hello world!
pause>nul

0

我需要隐藏从资源管理器上下文菜单中调用的批处理文件的窗口,还需要在参数上添加引号。没有一个答案对我有用,因此我添加了自己的解决方案。

我在资源管理器上下文菜单的注册表“命令”上有此命令:

cmd /c C:\mypath\myprogram.bat "%1"

因此,要替换它,我必须创建一个如下的vb:

WScript.CreateObject ("WScript.shell").run "cmd /c C:\mypath\myprogram.bat """ & WScript.Arguments(0) & """", 0, False

保存在类似的地方C:\mypath\myscript.vbs,然后在注册表中这样调用它:

wscript "C:\mypath\myscript.vbs" "%1"

请注意,.bat路径不能包含空格,因此将其替换为8.3文件名。因此,例如C:\Program Files\myprogram.bat必须引用为C:\Progra~1\myprogram.bat。查看8.3文件名的用法dir /x


0

我创建了RunApp来完成这项工作,并在我的生产环境中使用了它,希望对您有所帮助。

如下配置:

文件:config.arg

:style:hidden

MyBatchFile.bat
arg1
arg2

然后启动runapp.exe


-1

这适用于Windows 8(可能是其他)

  1. 正常创建批处理文件
  2. 创建批处理文件的快捷方式
  3. 右键单击快捷方式>属性
  4. 点击布局
  5. 取消选中“让系统位置窗口”
  6. 设置左位置TP -1000
  7. 点击申请

  8. 单击快捷方式,它将运行,但您不会看到它:)


4
真?这不会在任务栏上显示为按钮吗?
斯科特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.