Выполнение арифметики и передача ее следующей команде

467
Matthieu Cartier

Я знаю, как сделать это в / 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 ...

2

2 ответа на вопрос

4
Dennis Williamson

Попробуйте это:

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 

Попробуйте оба варианта и посмотрите, какой из них лучше для вас.

Это абсолютно идеально. Вау, я не знал, что командная строка Windows будет такой плохой. : D Matthieu Cartier 13 лет назад 0
красиво я должен сказать bubu 13 лет назад 0
+1. Вот почему настоящие хакеры любят файлы .bat: нет ничего более хакерского! phogg 13 лет назад 0
1
bubu
  1. Насколько я знаю, cmd.exe не предлагает легкодоступной функции для оценки функции при исполнении.

  2. Если вы просто хотите подождать еще 1 секунду, просто вставьте в него другой ping -n 2 127.0.0.1.

  3. Вы можете рассмотреть возможность установки команды sleep из средств администрирования Windows Server .

  4. Как насчет установки Cygwin / PowerShell?

РЕДАКТИРОВАТЬ: исправить мою глупость параметра ping

Это невозможно, его необходимо развернуть на клиентах без cygwin / powershell, и он должен быть автономным в виде пакетного файла. Другой `ping 127.0.0.1 -n 1`, поскольку он выполняется и завершается почти мгновенно. Matthieu Cartier 13 лет назад 0
должен был быть другой "ping -n 2 127.0.0.1" извините за мою грубую глупость. должен был понять, что ping -n [k] 127.0.0.1 будет ждать k-1 секунды ... bubu 13 лет назад 0
Хм, я полагаю, что это возможно, но не очень элегантно (не то, что это будет элегантно в любом случае ... командной строки Windows никогда не бывает). Matthieu Cartier 13 лет назад 0