@Habarovchanin
Свободный художник

Получить вывод команды командной оболочки в переменную makefile?

При обработке makefile в nmake требуется получить номер версии powershell для дальнейшей её проверки и работы с ней.
Пробовал назначить переменную окружения, но как‐то не получается.
psversion:
!IF [for /F %i in ('powershell $$psversiontable.psversion.major') do @set PSvr=%i]
!ENDIF

Пробовал напрямую проверять номер версии, тоже не работает. В этом случае, как я понимаю, ожидается код завершение, а не возвращаемое значение.
psversion:
!    IF [powershell $$PSVersionTable.PSVersion.major] <= 2
!    ERROR 
!    ENDIF

Пробовал присваивать команду переменной и потом вызывать её в условии проверки, тоже не получается.
psversion:
psvr = [powershell $$PSVersionTable.PSVersion.major]
!    IF $(psvr) <= 2
!    ERROR 
!    ENDIF

В общем, идеи закончились. Как надо сделать?
  • Вопрос задан
  • 170 просмотров
Решения вопроса 2
@MaxKozlov Куратор тега PowerShell
1. Вот тут придумали рекурсивный вызов
https://stackoverflow.com/questions/4883021/how-to...

2.
не имею ни малейшего представления насчёт фич nmake, но может быть, у него есть что-то, что проверяет, например, дату создания/редактирования файла ? тогда можно обойтись без запуска самого powershell.

Кстати, переменная $PSVersionTable появилась именно в v2, поэтому проверка типа IF $(psvr) <= 2 вам вообще недоступна, в принципе :)

3. Если nmake умеет обрабатывать код возврата, то можно так:
powershell -nologo -noprofile "exit $psversiontable.psversion.major"

В коде возврата версию вернёт
проверял на батнике
@powershell -nologo -noprofile "exit $psversiontable.psversion.major"
@echo %ERRORLEVEL%
Ответ написан
@Habarovchanin Автор вопроса
Свободный художник
Итак, решение, устраивающее в этой ситуации и для этой задачи, было найдено.
Благодаря подсказке MaxKozlov и исходя из сказанного в документации:

Another way to use exit codes is during preprocessing. You can run a command
or program and test its exit code using the !IF preprocessing directive. For more
information, see “Executing a Program in Preprocessing” on page 575.


chkpsver :
!    IF [powershell -nologo -noprofile "exit $$psversiontable.psversion.major"] == 2
!    ERROR Для работы требуется версия программы «PowerShell» версии 3.0 или выше
!    ELSE
!    MESSAGE ok
!    ENDIF

Также можно использовать вариант с stackoverflow.com , на который указал MaxKozlov , или ещё одна реализация , и которые основываются на положениях документации:
Calling NMAKE Recursively
In a commands block, you can specify a call to NMAKE itself. Either invoke
the MAKE macro or specify NMAKE literally. The following NMAKE
information is available to the called NMAKE session during recursion:
� Environment-variable macros (see “Inherited Macros” on page 563). To
cause all macros to be inherited, specify the /V option.
� The MAKEFLAGS macro. If .IGNORE (or !CMDSWITCHES +I) is set,
MAKEFLAGS contains an I when it is passed to the recursive call.
Likewise, if .SILENT (or !CMDSWITCHES +S) is set, MAKEFLAGS
contains an S when passed to the call.
� Macros specified on the command line for the recursive call.
� All information in TOOLS.INI.
Inference rules defined in the makefile are not passed to the called NMAKE
session. Settings for .SUFFIXES and .PRECIOUS are also not inherited.
However, you can make .SUFFIXES, .PRECIOUS, and all inference rules
available to the recursive call either by specifying them in TOOLS.INI or by
placing them in a file that is specified in an !INCLUDE directive in the makefile
for each NMAKE session.

Другие варианты пока не проверены, но попробовать можно будет, когда найдётся время.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@mvv-rus
Настоящий админ AD и ненастоящий программист
В командной строке:
for /F %i in ('powershell.exe $PSVersionTable.PSVersion.Major') do set PSVER=%i

Если вставляете в командный файл - замените %i на %%i
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы