1

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

无论如何,我写的那批作品非常好;除了我需要它静默运行。基本上这里是它执行的任务:

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

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

我尝试了几种方法;iexpress 效果很好,但没有静音选项;如果我选择静默, Bat To EXE 转换器可以工作但拒绝编译;最后是使用 7zS.sfx 的 7zip,但一旦编译它就拒绝运行。对于我一直在使用资源黑客来调整软件信息、图标、Microsoft 兼容性等的所有 exe。我被指向 Inno Setup,但发现它无法创建静默标志,大多数文章只是说要做一个图标并将标志放在那里,这对我的问题来说是一个糟糕的解决方案。

我什至应该从哪里开始?

4

1 回答 1

1

有许多简单的方法可以在没有控制台窗口的情况下运行批处理文件。无需重新实现您的批处理文件。

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

引用@Shaji如何在不启动“命令窗口”的情况下运行批处理文件的答案?

将以下内容另存为 wscript,例如,将“testing.bat”替换为批处理文件的名称后的 hidecmd.vbs。

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

的第二个参数oShell.RunintWindowStyle表示程序窗口外观的值,零值表示隐藏窗口。

参考在这里 https://docs.microsoft.com/en-us/previous-versions/d5fk67ky(v=vs.85)


其他方法见:


如果你真的需要一个 .exe,你可以使用 Inno Setup 来构建它。只需在InitializeSetup事件函数中运行您的批处理文件,然后中止“安装”。结果.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
于 2016-12-03T07:56:24.373 回答