• Проверка доступности URI‐адреса средствами powershell на подобие curl?

    @Habarovchanin Автор вопроса
    Свободный художник
    Итак, решение, приемлемое для этой конкретной задачи, было найдено!
    Огромнейшее спасибо всем, кот подсказывал направление поиска решения! Отдельная благодарность сергей кузьмин (если бы я увидел его ответ раньше...)

    А решение, как оказалось, достаточно простое:
    powershell -nologo -noprofile "%{[Net.ServicePointManager]::SecurityProtocol = 'Tls12, Tls11, Tls, Ssl3'} ;(Invoke-WebRequest -UseBasicParsing -Uri <ULR>).StatusCode;exit [int]$Error[0].Exception.Status"


    Результат считывается из значение свойства "Status" члена "Exception" в переменной $Error. Это помогает обработать ситуации типа такой
    Invoke-WebRequest : Невозможно разрешить удаленное имя: 'cle.linux.org.tw'
    строка:1 знак:77
    + %{[Net.ServicePointManager]::SecurityProtocol = 'Tls12, Tls11, Tls, Ssl3'} ;Invo ...
    + ~
    ~~~
    + CategoryInfo: InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

    Когда до ответа сервера ("Response") дело даже не доходило, и получали "0" код возврата, хотя ошибка была. Значить искать причину надо было где‐то раньше.
    Посмотрев через $Error[0].Exception | Get-Member видим, что в "Exception" есть такое свойство как
    Status           Property   System.Net.WebExceptionStatus Status {get;}
    , которое и даёт ответ, было соединение или нет.

    Ну, вот, как‐то так. Почти полный аналог "curl".

    Если надо получить строковое описания статуса соединения, то необходимо убрать [int] перед $Error[0].Exception.Status. Ещё обратите внимание, что считывается последний код Exception текущей сессии.
    Ответ написан
  • Получить вывод команды командной оболочки в переменную makefile?

    @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.

    Другие варианты пока не проверены, но попробовать можно будет, когда найдётся время.
    Ответ написан
    Комментировать