Запустите VBS из Nodejs в фоновом режиме (планировщик задач или служба Windows) - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь преобразовать файл Excel в PDF из приложения NodeJS. Он работает, когда я запускаю Node в командной строке, но когда я запускаю свой app.bat в качестве службы Windows через NSSM или непосредственно с помощью планировщика задач, он больше не работает.

С помощью приведенного ниже сценария я могувидеть только первую строку в log.txt, которая является аргументами программы. Если бы все шло хорошо, я должен видеть 0, затем 1 и 2. К сожалению, когда Node работает в фоновом режиме, у меня нет никакого числа, поэтому я предполагаю, что проблема CreateObject("Excel.Application"), но я не знаюпочему и как это решить.

VBScript:

Set objFSO=CreateObject("Scripting.FileSystemObject")
outFile="C:\Users\admin\Documents\Projects\tools\log.txt"
Set objFile = objFSO.CreateTextFile(outFile,True)
objFile.Write Wscript.Arguments.Item(0) & " | " & WScript.Arguments.Item(1) & vbCrLf

Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook

objFile.Write "0" & vbCrLf
Set oBook = oExcel.Workbooks.Open(Wscript.Arguments.Item(0))

objFile.Write "1" & vbCrLf
oBook.ExportAsFixedFormat xlTypePDF, WScript.Arguments.Item(1)

objFile.Write "2" & vbCrLf
oBook.Close True

NodeJS:

const {exec} = require('child_process');
exec('"' + Meteor.settings.directories.tools + 'convertToPDF.vbs" "' + outputServerFilePathChild + '.xlsx" "' + outputServerFilePathChild + '.pdf"', (err, stdout, stderr) => {
  if (err) {
    console.log(stderr);
    reject(new Error(stderr));
  } else {
    if (fs.existsSync(outputServerFilePathChild.replace(/ /g, "%20") + ".pdf")) {
      console.log('rename "' + outputServerFilePathChild.replace(/ /g, "%20") + '.pdf" "' + outputServerFilePathChild + '.pdf"');
      exec('rename "' + outputServerFilePathChild.replace(/ /g, "%20") + '.pdf" "' + outputServerFilePathChild + '.pdf"', (err, stdout, stderr) => {
        console.log("File generated: " + outputServerFilePathChild + ".pdf");
                resolve(outputClientFilePathChild + ".pdf");
              });
    } else {
      console.log("File generated: " + outputServerFilePathChild + ".pdf");
      resolve(outputClientFilePathChild + ".pdf");
    }
  }
});

Я тоже пробовалтакие вещи:

const child2 = spawn('start', [
            '"PDFConverter"',
            'cscript',
            '"C:\\Users\\admin\\Documents\\Projects\\tools\\convertToPDF.vbs"',
            '"C:\\Users\\admin\\Documents\\Projects\\reports\\admin\\rebates\\customer1 2019-09-30.xlsx"',
            '"C:\\Users\\admin\\Documents\\Projects\\reports\\admin\\rebates\\customer1 2019-09-30.pdf"'
        ], {
            shell: true,
            windowsHide: true,
        });

Однако это тоже не работает. У кого-нибудь есть идея?

...