Задать вопрос
  • Как присвоить переменной значение последовательности команд?

    @NortheR73
    системный инженер
    Как-то так, если взять PowerShell
    $vlc_count = (Get-Process -Name 'vlc').count
    If ($vlc_count -gt 2){Stop-Process -Name 'vlc' -Force}
    Start-Process vlc.exe
    Ответ написан
    Комментировать
  • Как присвоить переменной значение последовательности команд?

    wisgest
    @wisgest
    Не ИТ-специалист
    1-й способ) Перенаправить вывод команды в файл и ввести переменную из этого файла:
    tasklist /fi "IMAGENAME eq vlc.exe" | find /c /i "vlc.exe">file.tmp
    set /p "VAR="<file.tmp
    del file.tmp

    2-й способ) Обработать в цикле с ключом /f вывод команды:
    for /f %%V in ('tasklist /fi "IMAGENAME eq vlc.exe" ^| find /c /i "vlc.exe"') do  set "VAR=%%V"

    (При этом не придётся создавать вспомогательный файл, но для выполнения команды будет запускаться дополнительный процесс cmd.exe.)
    Ответ написан
    2 комментария
  • Как добавить отметку времени в выводе команды ping?

    wisgest
    @wisgest
    Не ИТ-специалист
    Вывод команды ping перенаправляется на вход сложной команды.

    При перенаправлении ввода-вывода между командами (|) в cmd (сказанное не относится к перенаправлению в/из файл(а)), когда с какой-то из сторон стоит внутренняя или составная команда, для неё запускается отдельный процесс cmd.exe, поэтому лучше задать это явно, чтобы иметь возможность точно указать параметры его запуска, как мудро и проделано в рассматриваемом примере (но, похоже, забыли про обычно используемый в таких случаях ключ /d для отключения выполнения возможных команд из реестра при запуске нового процессаcmd).

    1. Как работает эта часть кода (pause&pause)>nul

    Пропускаются две первые строки из входного потока принимающего процесса:
    pause ожидает ввод от пользователя и, когда на её вход поступает строка, прекращает ждать, >nul подавляет (перенаправляет на пустое устройство) приглашение от pause нажать любую клавишу (в данном случае подавляется весь вывод составной команды, состоящей из двух pause).

    Вместо этого можно было без >nul использовать, например, две команды set /p, даже и не указывая перед знаком равенства имя переменной, в которую вводится строка.

    Добавлено: Как выяснилось при обсуждении вопроса, дело обстоит сложнее…

    2. Как работает эта часть set /p "data=" && echo(!date! !time! !data!)

    Очередная строка из входного потока вспомогательного процесса cmd, то есть из выходного потока ping, помещается (set /p) в переменную окружения data и в случае успеха (&&), за который считается то, что была введена непустая строка (иначе переменная окружения не изменяется), выполняется следующая команда echo, выводящая строку из разделённых пробелами псевдопеременных date, time и только что установленной переменной data.
    Псевдопеременные date иtime содержат текущие дату и время, но только если не определены одноименные переменные окружения, поэтому для учёта всех возможных случаев их следовало бы в начале явным образом сбросить.

    Имена переменных заключены в восклицательные знаки, а не знаки процента, для отложенного раскрытия изменяющихся переменных в команде повторения (цикле) , а не однократной подстановки их значений до выполнения цикла. Возможность использовать отложенное раскрытие в данном случае включается ключом /v команды cmd. (Возможно также для отложенного раскрытия использовать команду call…)

    Открывающая скобка сразу после echo — это не открывающая скобка составной команды, а разделитель между командой echo и её аргументом, а закрывающая скобка относится к составной команде в цикле for /l %a in () do.

    Зачем нужна команда ping -n 2 8.8.8.8>nul после бесконечного цикла, я не знаю и буду рад увидеть разъяснения этому.
    Добавлено: Но без неё изменяется формат вывода:
    7.10.2022 21:47:58,02 Ответ от 8.8.8.8:
    7.10.2022 21:47:58,04 число байт=32 время=244мс TTL=104
    7.10.2022 21:47:59,04 Ответ от 8.8.8.8:
    7.10.2022 21:47:59,04 число байт=32 время=240мс TTL=104
    7.10.2022 21:48:00,05 Ответ от 8.8.8.8:
    7.10.2022 21:48:00,05 число байт=32 время=233мс TTL=104


    Спасибо за интересный вопрос!
    Ответ написан