Estoy trabajando en una aplicación de lanzamiento de software. No puedo saber cómo iniciar otra aplicación al hacer clic en un botón en mi aplicación NWJS. Lo he hecho antes en un HTA en el pasado para lanzar mis videojuegos, pero no puedo entenderlo aquí. En el hta, tuve que generar un archivo bat al hacer clic y luego el script bat ejecutó el programa.
Mi botón que he hecho:
<span name="SystemWrapper3" id="SystemWrapper3" class="SystemWrapper3"> <input type="button" value="Calculator" name="SystemInput3" id="SystemInput3" class="SystemInput3" /> <i class="fa-solid fa-square-root-variable fa-lg" id="SystemIcon4"></i> </span>He estado investigando, todavía soy bastante nuevo en esto. Probé varias soluciones que encontré buscando cosas en línea, pero no funcionaron. nose si es incompatibilidad de versiones o que? Estoy usando NWJS 0.64.1 Win64 Puede o no terminar siendo una aplicación NWJS que estoy lanzando, podría ser solo un exe normal. No estoy seguro de si hay diferentes requisitos para hacer ambos.
EDITAR::::
Encontré esto, pero no estoy seguro de cómo llamar a este código al hacer clic en mi botón. ¿Quizás convertirlo en una función? Luego llame al nombre de la función con onclick="myfunc()"?
var exec = require('child_process').execFile; exec('C:/asd/test.exe', function(err, data) { console.log(err) console.log(data.toString()); });EDITAR2::::
Así que probé esto y varias variaciones y todavía no tuve suerte. Lo llamé desde mi botón con onclick="launchbat()".
<script type="text/javascript"> function launchbat() { var exec = require('child_process').execFile; exec('"C:\Users\Dustin Angeletti\OneDrive\Documents\bat.bat"', function(err, data) { console.log(err) console.log(data.toString()); }); } </script>Esto debería funcionar. Aunque dependiendo de lo que desee, es posible que desee utilizar require('child_process').spawn en lugar de require('child_process').exec .
Vanilla JS: debe configurar cada botón (repetitivo) y actualizar la matriz.
<button id="calculator"> <i class="fa-solid fa-square-root-variable fa-lg"></i> Open Calculator </button> <button id="photoshop"> <i class="fa-solid fa-aperture fa-lg"></i> Open Adobe Photoshop </button> <script> const exec = require('child_process').exec; const path = require('path'); const appMap = [ { buttonId: 'calculator', executable: 'calc.exe' }, { buttonId: 'photoshop', executable: path.join('C:', 'Program Files (x86)', 'Adobe', 'Photoshop', 'photoshop.exe') } ]; function executionCallback (err, stdout, stderr) { if (err) { console.log({ err }); } if (stdout) { console.log({ stdout }); } if (stderr) { console.log({ stderr }); } } appMap.forEach(function (app) { const button = document.getElementById(app.buttonId) button.addEventListener('click', function () { exec(app.executable, {}, executionCallback); }); }); </script>Vue.js: puede usar Vue en su lugar, aquí todo lo que necesita actualizar es la matriz y Vue se encargará de todo lo demás.
<div id="app"> <button v-for="app in apps" @click="run(app.executable)"> <i class="fa-solid fa-lg" :class="app.icon"></i> {{ app.label }} </button> </div> <script src="https://unpkg.com/vue@3.2.36/dist/vue.global.prod.js"></script> <script> const exec = window.nw.require('child_process').exec; const path = window.nw.require('path'); const app = Vue.createApp({ data: function () { return { apps: [ { icon: 'fa-square-root-variable', label: 'Open Calculator', executable: 'calc.exe' }, { icon: 'fa-aperture', label: 'Open Adobe Photoshop', executable: path.join('C:', 'Program Files (x86)', 'Adobe', 'Photoshop', 'photoshop.exe') } ] } }, methods: { run: function (appExecutable) { const options = {}; exec(appExecutable, options, function (err, stdout, stderr) { if (err) { console.log({ err }); } if (stdout) { console.log({ stdout }); } if (stderr) { console.log({ stderr }); } }); } } }).mount('#app'); </script>Lo averigué. Muy simple, mi primer enfoque y el segundo funcionan bien. Mi problema todo el tiempo fue usar barras invertidas como en la verdadera ruta del archivo. Tienes que usar barras diagonales. Muy raro. Esto funciona para rutas relativas y absolutas.
function AppLaunch7() { const path = require('path'); nw.Shell.openItem(path.resolve('D:/SECURE DRIVE/SYSTEM CORE/SECURE CALC/SECURE CALC.exe')); } <div name="SystemWrapper1" id="SystemWrapper1" class="SystemWrapper1" onclick="AppLaunch7()"> <input type="button" value="Documents" name="SystemInput1" id="SystemInput1" class="SystemInput1" /> <span name="SystemIcon1" id="SystemIcon1" class="material-icons">description</span> </div>