Использование строкового литерала работает, но передача в качестве аргументов не - PullRequest
0 голосов
/ 03 мая 2019

Я передаю строковые литералы моему скрипту powershell следующим образом:

var spawn = require("child_process").spawn,
            child;
  child = spawn("powershell.exe", [
            "./scripts/ffmpeg_convert.ps1",
            `./cache/videos/${tempFileName + "."}${videoType}`,
            ` ./cache/converted_videos/${tempFileName + "."}${videoType}`
          ]);

Где spawn является частью node.js Spawn

И мой Сценарий powershell выглядит следующим образом:

param(
    [string]$originFile = $Args[0],
    [string]$outputFile = $Args[1]
)
echo "Moving moov atom"
ffmpeg -i $originFile -vcodec copy -acodec copy -movflags +faststart $outputFile

Но сценарий не будет выполняться с аргументом

./cache/videos/${tempFileName + "."}${videoType}

Однако, если я изменюаргумент для литеральной строки, скажем ./cache/videos/inputVideo.mov

, он выполняется просто отлично.

Это действительно заставляет меня чесать голову.

Я создал два тестовых сценария, которые работают с одним и тем же принципалом ... Так это просто способ перевода ${tempFileName + "."}${videoType}?И с учетом сказанного, если я повторю аргументы, они соответствуют ожиданиям.

Сценарий 1

 ./convert_videos.ps1 ./inputVideo.mov outputVideo.mov

Сценарий 2

 param(
    [string]$originFile = $Args[0],
    [string]$outputFile = $Args[1]
)
echo "Moving moov atom"
ffmpeg -i $originFile -vcodec copy -acodec copy -movflags +faststart $outputFile

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Единственная очевидная проблема с вашим кодом состоит в том, что есть начальный пробел в литерале шаблона, который передается в качестве последнего аргумента .

Этот начальный пробелсохраняется как часть аргумента, который предположительно делает недействительным путь.

Поэтому замените:

` ./cache/converted_videos/${tempFileName + "."}${videoType}`

на:

`./cache/converted_videos/${tempFileName + "."}${videoType}`

Два в стороне:

  • Вместо использования ${tempFileName + "."}${videoType} рассмотрите возможность использования более простого ${tempFileName}.${videoType}

  • В вашем скрипте PowerShell нет смысла присваивать = $Args[0] и = $Args[1] как значения по умолчанию для ваших параметров.Если вы укажете аргументы при вызове скрипта, они будут по умолчанию связаны позиционно;в противном случае соответствующий элемент $Args будет пустым.

0 голосов
/ 03 мая 2019

Я думаю, что у вас возникли проблемы с тем, как ваши параметры объявлены в вашем скрипте Powershell.Попробуйте следующее:

param(
    [Parameter(position = 0)]
    [string]$originFile,

    [Parameter(position = 1)]
    [string]$outputFile
)

# For debugging, check the values in PS
echo "Moving moov atom. originFile: $originFile. outputFile: $outputFile. Working Directory: $((Get-Location).Path)"
ffmpeg -i $originFile -vcodec copy -acodec copy -movflags +faststart $outputFile

Вы также можете называть параметры при вызове скрипта более мощным способом, хотя это не повлияет на выполнение скрипта, это выглядит лучше для тех из нас, кто погружен в Powershell.:)

var spawn = require("child_process").spawn,
        child;
child = spawn("powershell.exe", [
        "./scripts/ffmpeg_convert.ps1",
        "-originFile",
        `./cache/videos/${tempFileName + "."}${videoType}`,
        "-outputFile",
        ` ./cache/converted_videos/${tempFileName + "."}${videoType}`
      ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...