Я знаю, как это сделать в /bin/sh, но в Windows у меня возникли некоторые трудности.
Я знаю, что можно выполнять арифметические действия с 32-битными знаковыми целыми числами с помощью
SET /a 2+2
4
Но как мне передать это следующей команде? Например, процесс, который я хочу выполнить, выглядит следующим образом.
Потребительские версии Windows не имеют собственной функции автоматического сна (я полагаю?) — лучший способ выполнить сон — использовать его PING
вместе с -n
переключателем, чтобы получить столько секунд сна, минус одна. Следующая команда эффективна для тихого сна:
PING localhost -n 3 > NUL
Но я хочу сделать это псевдонимом в команде сна. Я хотел бы сделать это элегантно, чтобы вы вводили фактическое количество секунд, которое вы хотите спать после команды, прямо сейчас я могу сделать
DOSKEY SLEEP=PING 127.0.0.1 -n $1 > NUL
Это работает, но это всегда на 1 секунду меньше, чем вы вводите, так что если вы хотите поспать одну секунду, вам придется использовать команду SLEEP 2
. Это не совсем идеально.
Есть ли способ передать арифметику $1+1
и передать ее следующей команде в Windows? Я предполагаю, что есть способ использовать STDOUT...
решение1
Попробуйте это:
DOSKEY SLEEP==set /a t=$1+1 $G NULL $T PING 127.0.0.1 -n %t% $G NULL
— $T
разделитель команд, эквивалентный &
.
Обратите внимание, что > NUL
перенаправляет вывод, DOSKEY
а не макрос. Вы можете видеть, что он не включается, если вы делаете DOSKEY /MACROS
. Чтобы выполнить перенаправление, которое вам нужно, добавьте $G NUL
в конец строки, как показано выше.
Что-то вроде этого тоже подойдет:
DOSKEY SLEEP=for /f %t in ('set /a $1+1') do @PING 127.0.0.1 -n %t $G NUL
Попробуйте оба варианта и посмотрите, какой из них подходит вам больше.
решение2
Насколько мне известно, cmd.exe не предоставляет готовых функций для оценки функции во время ее выполнения.
Если вы просто хотите подождать еще 1 секунду, просто вставьте в него еще одну команду ping -n 2 127.0.0.1.
Вы можете рассмотреть возможность установки команды sleep изинструменты администрирования сервера Windows.
Как насчет установки cygwin/powershell?
EDIT: исправьте мою глупость с параметром ping