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

Moa*_*ini 168 windows command-line batch-file

我正在寻找某种方式来运行一个批处理文件 (.bat),而没有任何对用户可见的内容(没有窗口,没有任务栏名称,等等)。

我不想使用某些程序来做到这一点,我正在寻找更清洁的东西。我找到了一个使用 VBScript的解决方案,但我也不喜欢使用 VBS。

har*_*ymc 143

解决方案1:

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

CreateObject("Wscript.Shell").Run """" & WScript.Arguments(0) & """", 0, False
Run Code Online (Sandbox Code Playgroud)

要不可见地运行任何程序或批处理文件,请像这样使用它:

wscript.exe "C:\Wherever\invisible.vbs" "C:\Some Other Place\MyBatchFile.bat"
Run Code Online (Sandbox Code Playgroud)

为了也能够传递/中继参数列表,只使用两个双引号

wscript.exe "C:\Wherever\invisible.vbs" "C:\Some Other Place\MyBatchFile.bat"
Run Code Online (Sandbox Code Playgroud)

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

解决方案2:

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

  • 如何修改它以传递所有参数?传递参数而不引用它们会更方便。 (7认同)
  • @Starx VB 语法。`&` 表示连接字符串。字符串用双引号 (`"`) 括起来。字符串分隔符内的连续双引号 (`""`) 表示文字双引号 (`"`)。因此,四个双引号 (`""""`) 将是一个字符的字符串文字,一个双引号 (`"`)。把它们放在一起,然后`"""" & WScript.Arguments(0) & " """` 将变成 `"<argument>"`,其中 `<argument>` 是传递给脚本的第一个命令行参数。 (6认同)
  • 这是否仍然需要您创建一个批处理文件以将 `wscript.exe "C:\Wherever\invisible.vbs" ...` 放入其中? (3认同)
  • 为什么是4个双引号,你能解释一下吗? (2认同)
  • 如何使用此解决方案:**1:** 创建您要运行的批处理文件(即在`C:\apps\mybatch.bat`)。**2:** 创建 invisible.vbs 脚本(即在`C:\apps\invisible.vbs`)。**3:** 通过右键单击要保存快捷方式的文件夹的*背景*(空白区域),将鼠标悬停在上下文菜单中的“新建”上,单击“快捷方式”来创建新的快捷方式。对于“项目的位置”,输入 `wscript.exe "C:\apps\invisible.vbs" "C:\apps\mybatch.bat"`。双击此快捷方式将静默启动批处理文件。 (2认同)

小智 32

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

  • 在 Windows 7 等较新的 Windows 版本中是否有与 lexpress.exe 等效的东西? (7认同)
  • @Sнаđошƒаӽ它在Windows 7中......刚刚测试过 (3认同)
  • 我可以确认@ArneS 的评论。您可以构建 EXE,但由于文件丢失(即 Command.com),它无法运行。 (2认同)

Joh*_*n T 12

通过 at 作业运行脚本而不使其具有交互性:

at 11:00 script.bat
Run Code Online (Sandbox Code Playgroud)

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

例子:

import os

os.system("tasklist > C:\tasks.txt")
os.system("ipconfig /all > C:\netinfo.log")
Run Code Online (Sandbox Code Playgroud)

  • 但是我将如何运行这个命令? (3认同)

Bij*_*N-R 12

我不喜欢 VBScript 解决方案。

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

nircmd.exe win hide ititle "cmd.exe"
Run Code Online (Sandbox Code Playgroud)

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

title MyBatch
nircmd.exe win hide ititle "MyBatch"
Run Code Online (Sandbox Code Playgroud)


joe*_*joe 11

使用Cmdow是 NT4/2000/XP/2003 的 Win32 命令行实用程序,它允许列出、移动、调整大小、重命名、隐藏/取消隐藏、禁用/启用、最小化、最大化、恢复、激活/停用、关闭、杀死和更多的。

运行一个批处理文件隐藏传递它的参数:-

cmdow /run /hid mybat arg1 "arg 2"

  • cmdow 被大多数防病毒产品检测为恶意软件。因此,很难在您拥有 PC 以外的地方使用此解决方案。 (9认同)
  • 嗯,它是开源的,所以非常棒。可以在这里获取源代码:https://github.com/ritchielawrence/cmdow (2认同)

小智 11

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

优点:

 No Command Window
 Ability to use an icon
 Same Functionality of bat file
Run Code Online (Sandbox Code Playgroud)

缺点:

 Limited to one line, so many characters
Run Code Online (Sandbox Code Playgroud)


Bra*_*ert 8

您可以轻松地将其最小化。

start /MIN batch.cmd
Run Code Online (Sandbox Code Playgroud)

  • 或使用 /B 代替! (5认同)
  • `start` 是 `cmd` 内置命令。它无法从任务计划程序等中获得 (4认同)
  • 但是要使用“start”,您需要打开另一个“cmd”控制台窗口(虽然短暂)。无论如何,@gavenkoa,要从任何地方使用“start”,只需通过“cmd”运行它:“cmd /c start /MIN batch.cmd”。 (3认同)

end*_*ith 7

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

#NoTrayIcon ; To prevent momentary icon pop-up
run whatever.bat arg1 arg2,,hide 
Run Code Online (Sandbox Code Playgroud)


dja*_*fan 6

使用Windows7,您可以使用“计划任务”控制面板来安排批处理文件以指定的权限在后台隐形运行,甚至可以作为“系统”帐户运行。请看下面的截图:

在此处输入图片说明

此外,虽然没有那么多功能,但您也可以使用“AT.exe”命令从命令行创建一个不可见的批处理脚本任务,而不使用“/interactive”选项。

  • 隐藏复选框只是隐藏任务计划程序用户界面中的任务( (6认同)
  • 当任务不需要“SYSTEM”权限(并且没有经过安全漏洞检查和强化)时,以“SYSTEM”身份运行任务是一个坏主意;请参阅[此处的评论](/sf/ask/459811551/#6568823)。 (3认同)

Bul*_*aza 5

优秀的Bat To Exe 转换器会将您的.bat.cmd文件转换为.exe文件。

它有一个简单的用户界面。您可以选择不通过选择有一个控制台窗口Exe FormatXX Bit | Windows (Invisible)选项。此外,它还允许您分配图标、设置密码和其他几个选项。


Swi*_*ank 5

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 );
Run Code Online (Sandbox Code Playgroud)

  • WINAPI 方法的正确答案。这是[源代码和应用程​​序](/sf/ask/35514321/#56111754)作为补充您的答案。 (2认同)