Ich weiß, wie das in /bin/sh geht, aber unter Windows habe ich ein paar Schwierigkeiten.
Ich weiß, dass man Arithmetik mit 32-Bit-Integern mit Vorzeichen durchführen kann mit
SET /a 2+2
4
Aber wie übergebe ich dies an den nächsten Befehl? Der Vorgang, den ich ausführen möchte, ist beispielsweise wie folgt.
Consumer-Editionen von Windows haben keine native automatische Ruhezustandsfunktion (glaube ich?) - die beste Möglichkeit, einen Ruhezustand zu erreichen, besteht darin, ihn PING
in Verbindung mit dem -n
Schalter zu verwenden, um so viele Sekunden minus eine Ruhezeit zu erhalten. Der folgende Befehl ist für einen stillen Ruhezustand wirksam:
PING localhost -n 3 > NUL
Aber ich möchte dies in einen Schlafbefehl umwandeln. Ich hätte es gerne elegant, sodass Sie die tatsächliche Anzahl der Sekunden eingeben, die Sie nach dem Befehl schlafen möchten. Im Moment kann ich Folgendes tun:
DOSKEY SLEEP=PING 127.0.0.1 -n $1 > NUL
Das funktioniert, ist aber immer 1 Sekunde kürzer als Ihre Eingabe. Wenn Sie also eine Sekunde lang schlafen möchten, müssen Sie den Befehl verwenden SLEEP 2
. Das ist nicht gerade ideal.
Gibt es für mich eine Möglichkeit, die Arithmetik zu übergeben $1+1
und sie an den nächsten Befehl in Windows weiterzugeben? Ich gehe davon aus, dass es eine Möglichkeit gibt, STDOUT zu verwenden ...
Antwort1
Probieren Sie Folgendes aus:
DOSKEY SLEEP==set /a t=$1+1 $G NULL $T PING 127.0.0.1 -n %t% $G NULL
Dies $T
ist ein Befehlstrennzeichen, das dem entspricht &
.
Beachten Sie, dass die > NUL
Ausgabe von umgeleitet wird DOSKEY
und nicht das Makro. Sie können sehen, dass es nicht eingeschlossen ist, wenn Sie dies tun DOSKEY /MACROS
. Um die gewünschte Umleitung durchzuführen, fügen Sie $G NUL
wie oben gezeigt an das Ende der Zeile an.
So etwas wie das hier wird auch funktionieren:
DOSKEY SLEEP=for /f %t in ('set /a $1+1') do @PING 127.0.0.1 -n %t $G NUL
Probieren Sie beides aus und finden Sie heraus, was für Sie besser funktioniert.
Antwort2
Soweit ich weiß, bietet cmd.exe keine sofort verfügbare Funktion zur Auswertung von Funktionen während der Ausführung.
Wenn Sie nur noch 1 Sekunde warten möchten, fügen Sie einfach einen weiteren Ping -n 2 127.0.0.1 ein.
Sie können die Installation des Sleep-Befehls über dasTools zur Windows Server-Verwaltung.
Wie wäre es mit einer Installation von Cygwin/Powershell?
EDIT: korrigiere die Dummheit meiner Ping-Parameter