Rechnen und an den nächsten Befehl übergeben

514
Matthieu Cartier

Ich weiß, wie man das in / bin / sh macht, aber ich habe ein bisschen Probleme mit Windows.

Ich weiß, dass Sie mit 32-Bit-Ganzzahlen mit Arithmetik rechnen können

SET /a 2+2 4 

Aber wie gebe ich das an den nächsten Befehl weiter? Zum Beispiel ist der Prozess, den ich ausführen möchte, wie folgt.

Consumer-Editionen von Windows verfügen über keine systemeigene automatische Schlaffunktion (glaube ich?). Der beste Weg, um einen Ruhezustand durchzuführen, besteht in der Verwendung PINGdes -nSwitches, um so viele Sekunden (minus eins) des Ruhezustands zu erhalten. Der folgende Befehl ist für einen stillen Schlaf wirksam:

PING localhost -n 3 > NUL 

Aber ich möchte dies in einen Schlafbefehl alias. Ich möchte, dass es so elegant ist, dass Sie die tatsächliche Anzahl der Sekunden eingeben, die Sie nach dem Befehl schlafen möchten. Jetzt kann ich das tun

DOSKEY SLEEP=PING 127.0.0.1 -n $1 > NUL 

Was funktioniert, aber es ist immer 1 Sekunde weniger 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 eine Möglichkeit für mich, die Arithmetik von $1+1und an den nächsten Befehl in Windows weiterzugeben? Ich gehe davon aus, dass es eine Möglichkeit gibt, STDOUT zu verwenden ...

2

2 Antworten auf die Frage

4
Dennis Williamson

Probieren Sie es aus:

DOSKEY SLEEP==set /a t=$1+1 $G NULL $T PING 127.0.0.1 -n %t% $G NULL 

Der $TBefehlstrenner entspricht dem Befehl &.

Beachten Sie, dass die > NULAusgabe DOSKEYstatt des Makros umgeleitet wird . Sie können sehen, dass es nicht dabei ist DOSKEY /MACROS. Um die gewünschte Umleitung durchzuführen, hängen Sie $G NULwie oben gezeigt am Ende der Zeile an.

So etwas 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 beide aus und sehen Sie, welche für Sie besser funktioniert.

Das ist absolut perfekt. Wow, ich wusste nicht, dass die Windows-Befehlszeile so schlecht sein würde. : D Matthieu Cartier vor 13 Jahren 0
schön muss ich sagen bubu vor 13 Jahren 0
+1. Aus diesem Grund lieben echte Hacker .bat-Dateien: Es gibt nichts Heiseres! phogg vor 13 Jahren 0
1
bubu
  1. Soweit ich weiß, bietet cmd.exe keine frei verfügbare Funktion für die Auswertung der Funktion während der Ausführung.

  2. Wenn Sie nur eine Sekunde warten möchten, fügen Sie einfach einen weiteren Ping -n 2 127.0.0.1 hinzu.

  3. Sie können die Installation des Schlafbefehls über die Windows Server-Verwaltungstools in Betracht ziehen .

  4. Wie wäre es mit einer Installation von cygwin / powershell?

BEARBEITEN: Korrigiere meine Dummheit des Ping-Parameters

Nicht möglich, dies muss auf Clients ohne cygwin / powershell implementiert werden und muss als Batch-Datei eigenständig sein. Ein weiterer "ping 127.0.0.1 -n 1" während er ausgeführt wird und fast sofort beendet wird. Matthieu Cartier vor 13 Jahren 0
Sollte ein weiterer "Ping -n 2 127.0.0.1" gewesen sein, sorry meine grobe Dummheit. sollte den Hinweis genommen haben, dass ping -n [k] 127.0.0.1 für k-1 Sekunden wartet ... bubu vor 13 Jahren 0
Hm, ich denke das ist eine Möglichkeit, aber nicht wirklich eine elegante (nicht dass das sowieso elegant sein wird ... Windows-Befehlszeile ist nie). Matthieu Cartier vor 13 Jahren 0