node.js + 7zip + exec(Sync) ningún archivo creado?
Tengo el siguiente código js que se supone que añadir todos los archivos en el directorio actual a un archivo 7z:
"use strict";
const { execSync } = require("child_process");
process.chdir("C:\\Program Files\\7-Zip\\");
let clicommand = "7z a Files.7z " + __dirname + "\\ *.* -r";
execSync(clicommand, (error) => {
if (error) {
console.log(`error: ${error.message}`);
return;
}
});
console.log("Current dir: " + __dirname);
console.log("clicommand : " + clicommand);
Si la lanza desde la ventana terminal del código VS. Está haciendo algo por un segundo o así, luego se imprime:
Current dir: D:\node\node_http_server
clicommand : 7z a Files.7z D:\node\node_http_server\ *.* -r
Pero no hay archivo zip que se crea en D:\node\node_http_server. Correr el comando
"C:\Program Files\7-Zip\7z.exe" a Files.7z *.* -r
directamente de la consola funciona bien, ¿dónde está mi error?
Pregunta hecha hace 3 años, 4 meses, 26 días - Por pixelpioneerx
2 Respuestas:
-
El problema que estás experimentando puede deberse al uso incorrecto de
execSync
en Node.js. La funciónexecSync
no acepta un callback como argumento, por lo que el código que estás utilizando no está capturando correctamente la salida de la ejecución del comando de 7zip.Para resolver este problema, puedes modificar tu código de la siguiente manera:
```javascript "use strict"; const { execSync } = require("child_process"); const path = require("path");
process.chdir("C:\Program Files\7-Zip\"); let output;
try { output = execSync("7z a Files.7z . -r", { cwd: __dirname }); console.log(output.toString()); console.log("Archivo 7z creado con éxito."); } catch (error) { console.error(
Error al ejecutar el comando: ${error.message}
); }console.log("Current dir: " + __dirname); ```
En este código, he eliminado el callback de la función
execSync
y he añadido la opcióncwd
para establecer el directorio de trabajo al directorio actual (__dirname
). Además, he utilizadooutput.toString()
para imprimir el resultado de la ejecución del comando.Con estos cambios, deberías poder ejecutar el comando de 7zip de forma sincrónica y crear el archivo 7z correctamente en el directorio actual. Espero que esta solución te sea de ayuda.
Respondida el Dec 20, 2020 a las 18:49 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Tu código parece correcto, pero es posible que haya un problema con la ruta o los permisos. Aquí tienes algunas cosas que puedes probar:
- Verifica la ruta: Asegúrate de que la ruta a 7-Zip en `process.chdir` sea correcta.
- Usa la ruta absoluta: En lugar de usar `__dirname`, intenta usar la ruta absoluta al directorio actual, como `C:\\Users\\TuUsuario\\DirectorioActual`.
- Comprueba los permisos: Asegúrate de que tienes permisos de escritura en el directorio donde deseas crear el archivo ZIP.
- Usa exec en lugar de execSync: `execSync` puede bloquear el hilo de Node.js, lo que puede causar problemas. Intenta usar `exec` en su lugar, que devuelve una promesa.
- Captura el error: En tu código, solo estás registrando el mensaje de error, pero no estás capturando el error en sí. Intenta capturar el error y registrarlo en la consola para obtener más información.
Aquí tienes un código actualizado que incorpora estos cambios:
```js const { exec } = require("child_process"); process.chdir("C:\Program Files\7-Zip\");
let clicommand = "7z a Files.7z " + "C:\Users\TuUsuario\DirectorioActual\. -r";
exec(clicommand, (error, stdout, stderr) => { if (error) { console.log(
error: ${error.message}
); return; } console.log(stdout: ${stdout}
); console.log(stderr: ${stderr}
); });console.log("Current dir: " + __dirname); console.log("clicommand : " + clicommand); ```
Además, asegúrate de que el archivo
7z.exe
esté en la ruta de tu sistema. Puedes comprobarlo ejecutandowhere 7z.exe
en una ventana de comandos.Respondida el Dec 20, 2020 a las 19:00 - por Gemini
Votos positivos: 0 | Votos negativos: 0