Appunti: da batch a eseguibile

| |

Ho avuto la necessità di trasformare alcuni vecchi batch in file eseguibili da dare in pasto poi a utenti / sistemi di gestione PC centralizzati (distribuzione software e simili). Raccolgo qui di seguito degli appunti sparsi che potrebbero tornare utili anche a te o al me stesso di qualche non meglio definito futuro prossimo. Se vuoi aggiungere qualcosa sei assolutamente il benvenuto, non esitare a utilizzare l’area commenti per farmi sapere cosa ne pensi.

Source Code
Photo by Markus Spiske

La vecchia scuola: bat2exe & Co.

Mi ero costruito un piccolo tool che svolgeva questo mestiere, risale al 2014 e si chiama molto banalmente bat2exe. Lo avevo ereditato da uno spunto già ben sviluppato ma non più disponibile su SourceForge, te lo metto a disposizione qui: go.gioxx.org/bat2exe.

Il funzionamento è molto semplice:

Tutti i file nella cartella costituiranno un solo eseguibile.
L’ultimo file batch modificato verrà eseguito di default quando verrà lanciato il file .exe generato
OPZIONALE: se trovo un file .ico lo uso come icona

In alternativa c’era il caro vecchio Bat To Exe di F2KO, un sito web molto conosciuto che tra i suoi software proponeva anche questo in grado di trasformare un batch in eseguibile includendo ulteriori file in un pacchetto unico, ho trovato un riferimento ancora funzionante tramite Web Archive. Io ne ho ancora una copia del 2016 che funziona su sistemi x86 e x64, te l’ho caricata sul mio spazio Box, trovi tutto all’indirizzo go.gioxx.org/battoexe-f2ko.

In generale il problema comune di questo tipo di applicazioni risiede nella firma dell’eseguibile e della mancanza di una loro anagrafica nei database dei produttori antivirus, andrai quasi certamente incontro a una quarantena preventiva che non ti permetterà di far funzionare questi eseguibili nella tua rete a meno di inserirli in eccezioni centralizzate della tua console antivirus.

Le alternative

Diverse, all’interno di queste sicuramente potrei inserire e citare il “metodo 7-Zip” di cui ti ho parlato tempo fa (Utilizzare 7-Zip per creare pacchetti di installazione). Questo viene ripreso anche su Stack Overflow dove si riportano poi ulteriori esperienze e metodi interessanti che utilizzano alcuni escamotage che spesso non richiedono l’installazione di null’altro su un sistema Windows già aggiornato, come IExpress o il .NET (stackoverflow.com/questions/51098378/converting-bat-to-exe-with-no-additional-external-software-create-sfx/51104332).

Nello specifico del .NET si parla di compilazione passando per uno script C# che ho usato anche io per convertire un mio batch, la discussione su StackOverflow continua in questo post che fa parte del più ricco stackoverflow.com/questions/28174386/how-can-a-bat-file-be-converted-to-exe-without-third-party-tools dedicato ai metodi di trasformazione da batch a eseguibile pure lui. Considerato che spesso sulla stessa macchina risiedono più versioni del framework .NET di Microsoft può certamente tornarti utile un ulteriore batch in grado di pescare il più aggiornato presente sul tuo PC e utilizzare quello per la compilazione dello script C# di cui ti parlavo prima.

In soldoni il codice sorgente del file C# prende il file batch e ne permette la trasformazione in eseguibile:

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.IO;

class BatCaller {
    static void Main() {
        var batFile = System.Reflection.Assembly.GetEntryAssembly().Location.Replace(".exe", ".bat");
        if (!File.Exists(batFile)) {
            MessageBox.Show("The launch script could not be found.", "Critical error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            System.Environment.Exit(42);
        }
        var processInfo = new ProcessStartInfo("cmd.exe", "/c \"" + batFile + "\"");
        processInfo.CreateNoWindow = true;
        processInfo.UseShellExecute = false;
        processInfo.RedirectStandardError = true;
        processInfo.RedirectStandardOutput = true;

        var process = Process.Start(processInfo);

        process.OutputDataReceived += (object sender, DataReceivedEventArgs e) => Console.WriteLine("output>>" + e.Data);
        process.BeginOutputReadLine();

        process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => Console.WriteLine("error>>" + e.Data);
        process.BeginErrorReadLine();

        process.WaitForExit();

        Console.WriteLine("ExitCode: {0}", process.ExitCode);
        process.Close();
    }
}

Mentre il file batch che seleziona il .NET da utilizzare (codice anch’esso comparso su Stack Overflow) farà il resto:

@echo off
set dotNetBase=%SystemRoot%\Microsoft.NET\Framework\
rem get latest .net path containing csc.exe:
set dotNet20=%dotNetBase%v2.0.50727\
set dotNet35=%dotNetBase%v3.5\
set dotNet40=%dotNetBase%v4.0.30319\
if exist %dotNet20%nul set dotNet=%dotNet20%
if exist %dotNet35%nul set dotNet=%dotNet35%
if exist %dotNet40%nul set dotNet=%dotNet40%
set outPath=%~DP1
set outFileName=%~n1
"%dotNet%csc.exe" /t:winexe /win32icon:icon.ico /out:%outPath%%outFileName%.exe %1

Io ho solo fatto una piccola modifica che permette di utilizzare un file che diventerà l’icona dell’eseguibile prodotto (il file dovrà trovarsi nella stessa cartella del file batch di compilazione). Se non ci sono errori lanciando il batch dovresti raggiungere il tuo obiettivo e ottenere il file eseguibile nato dal tuo file bat.

Questo è quanto. L’area commenti è a tua totale disposizione per suggerire ulteriori metodi o spunti di discussione in merito all’argomento dell’articolo :-)

Correzioni, suggerimenti? Lascia un commento nell'apposita area qui di seguito o contattami privatamente.
Ti è piaciuto l'articolo? Offrimi un caffè! ☕ :-)

L'articolo potrebbe non essere aggiornato

Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio ti invito a lasciare un commento per chiedere ulteriori informazioni! :-)

Condividi l'articolo con i tuoi contatti:
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Commenti
Inline Feedbacks
View all comments