Встраивать JS-код в пакетный файл

У меня есть пакетный файл, который готовит файлы слов, переименовывая их и перемещая их. так что я делаю pdf для этих файлов, используя код javascript, который я нашел на этом веб-сайте. я называю это следующим образом:

for %%g in ("test\*.doc") do (cscript.exe //nologo "SAVEASPDF.js" "%%~fg") 

этот код JavaScript находится в другом файле как saveaspdf.js, чтобы сделать PDF. могу ли я встроить JS-код внутри пакетного файла (например, как :FUNCTION), чтобы сохранить весь код только в одном файле?

вот JS я m, пытающийся внедрить, я нашел его здесь, на этом веб-сайте.

var fso = new ActiveXObject("Scripting.FileSystemObject");
var docPath = WScript.Arguments(0);
docPath = fso.GetAbsolutePathName(docPath);

var pdfPath = docPath.replace(/\.doc[^.]*$/, ".pdf");
var objWord = null;

try
{
    WScript.Echo("Saving '" + docPath + "' as '" + pdfPath + "'...");

    objWord = new ActiveXObject("Word.Application");
    objWord.Visible = false;

    var objDoc = objWord.Documents.Open(docPath);

    var wdFormatPdf = 17;
    objDoc.SaveAs(pdfPath, wdFormatPdf);
    objDoc.Close();

    WScript.Echo("Done.");
}
finally
{
    if (objWord != null)
    {
        objWord.Quit();
    }
}

Ответ 1

Существует множество методов для встраивания и выполнения JScript в пакете script. Вот несколько:

  • fooobar.com/questions/22604/...
    Это мой любимый, и тот, который я буду использовать ниже

  • fooobar.com/questions/22605/...
    Мне не нравится этот метод, потому что он определяет дополнительную (нежелательную) переменную среды.

  • fooobar.com/questions/22604/... (до EDIT)
    Еще один отличный выбор.

  • fooobar.com/questions/7005/... (окончательный UPDATE 2014-04-27 внизу)
    Этот метод WSF не совсем удобен, но он эффективен в том, что вы можете встраивать и выполнять любое количество независимых заданий JScript и/или VBS в пределах одной партии script.

Итак, вот как вы могли бы использовать опцию 1. объединить два сценария в один файл:

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment

:: ******* Begin batch code *********
@echo off
for %%g in ("test\*.doc") do cscript //E:JScript //nologo "%~f0" "%%~fg"
exit /b

********* Begin JScript code **********/
var fso = new ActiveXObject("Scripting.FileSystemObject");
var docPath = WScript.Arguments(0);
docPath = fso.GetAbsolutePathName(docPath);

var pdfPath = docPath.replace(/\.doc[^.]*$/, ".pdf");
var objWord = null;

try
{
    WScript.Echo("Saving '" + docPath + "' as '" + pdfPath + "'...");

    objWord = new ActiveXObject("Word.Application");
    objWord.Visible = false;

    var objDoc = objWord.Documents.Open(docPath);

    var wdFormatPdf = 17;
    objDoc.SaveAs(pdfPath, wdFormatPdf);
    objDoc.Close();

    WScript.Echo("Done.");
}
finally
{
    if (objWord != null)
    {
        objWord.Quit();
    }
}

Ответ 3

Если вы посмотрите документацию для cscript.exe, кажется, что он хочет прочитать script из файла, поэтому я считаю, что вы здесь не повезло.

Запуск его через nodejs по предложению lleaff мог бы сработать, если ваш script был совместим с nodejs, но так как вы используете ActiveXObject для автоматизации Word он не будет выполняться.