Как использовать переменные «set» для консоли Windows в сценариях NPM? - PullRequest
0 голосов
/ 19 марта 2019

Это работает в консоли Windows, как и ожидалось:

set A="qwerty" && echo %A%

выход: "qwerty"

Но когда я пытаюсь запустить те же команды в NPM-скиптах:

package.json:

"scripts": {
  "qwerty": "set A=\"qwerty\" && echo %A%"
}

> npm run qwerty

вывод: %A%

Я что-то не так делаю или это просто не должно работать при запуске NPM?

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Ваш пример set A="qwerty" && echo %A% неверен.Переменные в приглашении cmd / командный файл раскрываются один раз для каждой строки / команды:

==> set "A="

==> echo %A%
%A%

==> set A="qwerty" && echo %A%
%A%

==> echo %A%
"qwerty"

Почему это поведение?

SET команда была впервые введена в MS-DOS 2.0 в марте 1983 года, в то время память и процессор были очень ограничены, и достаточно было разложить переменные один раз на строку .

AОбходной путь с помощью команды CALL :

==> set "A="

==> echo %A%
%A%

==> set A="qwerty" && CALL echo %A%
"qwerty"

Редактировать:

Для полноты, следующий пакетный скрипт показывает механизм расширения процента и его комбинациюс помощью команды CALL подробно (примечание удвоено % знаки процента в пакетном файле CALL Echo %%_var%%):

@ECHO OFF
SETLOCAL
if NOT "%~1"=="" ECHO ON
echo        1st:
Set "_var=first"
Set "_var=second" & Echo %_var% & CALL Echo %%_var%%  
echo        2nd: 
Set "_var=first"
Set "_var=second" & CALL Echo %%_var%% & Echo %_var%  

Вывод, echo OFF:

==> D:\bat\SO\55237418.bat
       1st:
first
second
       2nd:
second
first

Выход, echo ON:

==> D:\bat\SO\55237418.bat on

==> echo        1st:
       1st:

==> Set "_var=first"

==> Set "_var=second"   & Echo first   & CALL Echo %_var%
first
second

==> echo        2nd:
       2nd:

==> Set "_var=first"

==> Set "_var=second"   & CALL Echo %_var%   & Echo first
second
first
0 голосов
/ 19 марта 2019

До сих пор я обнаружил, что эти команды для правильной работы должны быть в разных сценариях и выполняться в определенном порядке. Итак, вот как это работает:

"scripts": {
  "aaa": "set TMP=test && npm run bbb",
  "bbb": "echo %TMP%"
}

npm run aaa

Выход: test

Но этот не сработает:

"scripts": {
  "aaa": "set TMP=test",
  "bbb": "npm run aaa && echo %TMP%"
}

npm run bbb

вывод: <just empty>

Похоже, две отдельные команды npm run необходимы для поиска созданной переменной: переменная должна быть создана в первом npm run и может быть найдена во втором.

...