将现有批处理转换为隐藏的 .exe 运行(没有控制台 window)

Convert existing batch to an .exe running hidden (with no console window)

我绝不是程序员,但基本上就是负责这个。我被指派使用我们预先存在的分发设置更新计算机网络,想想 sccm,除了只能做 .exe/msi 个文件。

无论如何,我写的批处理效果非常好;除了我需要它 运行 默默地。它执行的任务基本上如下:

  1. 使用 %computername% 在专用网络共享上创建日志,并在每次发生某事时添加一行,并使用包含时间和日期戳的 %errorlevel% 报告成功。
  2. 检查特定程序是否 运行ning,如果是,则等待 60 分钟并重试,如果不是,则检查之前安装的版本
  3. 根据版本,它将使用 robocopy 将过时的文件替换为新文件。
  4. 然后设置TNS名称路径
  5. 根据计算机名称配置刚刚安装的数据库
  6. 修改注册表
  7. 在桌面上放置一个图标
  8. 报告所有任务是否在日志中正确完成并退出。

批处理从网络共享中提取所有内容并将日志保存到同一共享中。因为我做这个花了很多时间,我希望我能以某种方式转换为 .exe 或 .msi,并且 运行 是静默的。我想我可以用我不熟悉的语言重写它。

我试过几种方法; iexpress 效果很好,但没有静音选项; Bat To EXE converter 可以工作,但如果我 select 沉默则拒绝编译;最后 7zip 使用 7zS.sfx,但一旦编译它就拒绝 运行。对于我一直在使用资源黑客调整软件信息、图标、Microsoft 兼容性等的所有 exe图标并将标志放在那里,这对我的问题来说是一个糟糕的解决方案。

我应该从哪里开始?

有很多简单的方法 运行 没有控制台 window 的批处理文件。无需重新执行您的批处理文件。

一种不需要任何第 3 方软件的简单方法是使用 VBScript 或 JScript 脚本,运行使用 WScript.Shell.Run methodintWindowStyle 参数设置为 0 的批处理文件( = 隐藏 window).

引用 answer by @Shaji to How to run a batch file without launching a “command window”?:

Save the following as wscript, for instance, hidecmd.vbs after replacing "testing.bat" with your batch file's name.

Set oShell = CreateObject ("Wscript.Shell") 
Dim strArgs
strArgs = "cmd /c testing.bat"
oShell.Run strArgs, 0, false

The second parameter of oShell.Run is intWindowStyle value indicating the appearance of the program's window and zero value is for hidden window.

The reference is here https://docs.microsoft.com/en-us/previous-versions/d5fk67ky(v=vs.85)


其他方法见:


如果你真的需要一个.exe,你可以使用Inno Setup来构建它。只需 运行 您在 InitializeSetup event function 中的批处理文件,然后中止“安装”。生成的 .exe 将没有 GUI。

[Setup]
AppName=My Program
AppVersion=1.5
; Mandatory directive, but not actually used in this "installer"
DefaultDirName={pf}\My Program

#define SetupBatchFile "setup.bat"

[Files]
; Embed the batch file to the installer
Source: "{#SetupBatchFile}"; Flags: dontcopy
[Code]

function InitializeSetup(): Boolean;
var
  BatchPath: string;
  ResultCode: Integer;
begin
  { Extract the batch file }
  ExtractTemporaryFile('{#SetupBatchFile}');
  Log('Running batch file');
  BatchPath := ExpandConstant('{tmp}\{#SetupBatchFile}');
  if not Exec(BatchPath, '', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) then
  begin
    Log('Error running batch file');
  end
    else
  begin
    Log(Format('Batch file finished with exit code %d', [ResultCode]));
  end;
  Log('Exiting');
  { Prevents the actual Inno Setup installer from running }
  Result := False; 
end;

如果您的批处理文件不需要管理员权限,请将此指令添加到 [Setup] 部分:

PrivilegesRequired=lowest