Toplu iş dosyasında uyumak


150

Bir Windows kutusunda bir şeyi otomatikleştirmek için bir toplu iş dosyası yazarken, birkaç saniye boyunca yürütülmesini duraklatmam gerekiyordu (genellikle bir test / bekleme döngüsünde, bir işlemin başlamasını bekliyor). O zaman, bulabildiğim en iyi çözüm, istenen etkiyi elde etmek için ping (çocuk değilim) kullanır. Burada daha iyi bir yazı yazdım, aşağıdaki gibi uygulanabilir bir çağrılabilir "wait.bat" açıklar:

@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul

Daha sonra kendi toplu iş dosyanıza wait.bat çağrılarını dahil edip uykuya geçmesi gereken saniye sayısını ekleyebilirsiniz.

Görünüşe göre Windows 2003 Kaynak Seti, Unix benzeri bir uyku komutu sağlar (sonunda!). Bu arada, hala Windows XP, Windows 2000 veya (ne yazık ki) Windows NT kullananlarımız için daha iyi bir yol var mı?

Komut satırında hiçbir argüman geçirilmezse, varsayılan olarak bir saniyede varsayılan olacak şekilde sleep.py, kabul edilen yanıtta komut dosyasını değiştirdim :

import time, sys

time.sleep(float(sys.argv[1]) if len(sys.argv) > 1 else 1)

Windows 2003 Kaynak Seti'nin Microsoft karşıdan yükleme sayfası , XP için de çalıştığını gösterir. Korkarım beklemek için 'harici' bir yardımcı program kullanmaktan başka bir seçenek yok: XP komut işlemcisinde böyle bir şey yok.
GerG

2003 sunucu kaynak kiti Windows XP (ve muhtemelen w2k ile) ile çalışır
Martin Beckett

Geçmişte de aynı sorunla karşılaştım ve kendime ping kullandım (yukarıda açık bir şekilde bunun aptal olduğunu fark ettiğimi belgeleyerek) :).
Jack Leow


2
Birkaç seçeneğiniz var - pingkomutla bir uyku taklit edin veya bir sleepkomut içeren windows kaynak kitini indirin . Daha fazla detay burada: Toplu dosya SLEEP Komutu
Rudu

Yanıtlar:


14

GÜNCELLEME

timeoutBaşka açıklandığı gibi itibaren Windows Vista edinilebilir ve komut, komut, kullanılması gereken cevabı bu soruya. Burada takip eden eski bir cevaptır.

Eski cevap

Python yüklüyse veya yüklemeyi önemsemiyorsanız (başka kullanımları da vardır :), aşağıdaki sleep.py komut dosyasını oluşturun ve PATH'nizde bir yere ekleyin:

import time, sys

time.sleep(float(sys.argv[1]))

Böyle bir ihtiyacınız varsa ikinci saniyeden kısa süreli duraklamalara (örneğin, 1,5 sn, 0,1 vb.) İzin verir. Bunun sleepyerine çağrı yapmak istiyorsanız sleep.py, .PYuzantıyı PATHEXT ortam değişkeninize ekleyebilirsiniz . Windows XP'de bunu düzenleyebilirsiniz:

Bilgisayarım → Özellikler (menü) → Gelişmiş (sekme) → Ortam Değişkenleri (düğme) → Sistem değişkenleri (çerçeve)


32
toplu iş komut dosyası çözümü istendiğinde neden python'a bir komut dosyası yazmalıyız? Yol uzantısı, Windows kullanıcılarının yüklü bir python yorumlayıcısının olmaması sorununu nasıl çözebilir? Teşekkürler.
Val

6
Taşınabilirlik uğruna, mükemmel ince yerel alternatifler olduğu için bu çözümden kaçınılması gerektiğini düşünüyorum.
Gras Double

1
Bu yaklaşım geçmişte bir geçici çözüm sunmuş olabilir, ancak @Blorgbeard tarafından açıklanan yerel çözüm kesinlikle gidilecek yoldur.
Mike

227

timeoutKomut itibaren Windows Vista edinilebilir:

c:\> timeout /?

TIMEOUT [/T] timeout [/NOBREAK]

Description:
    This utility accepts a timeout parameter to wait for the specified
    time period (in seconds) or until any key is pressed. It also
    accepts a parameter to ignore the key press.

Parameter List:
    /T        timeout       Specifies the number of seconds to wait.
                            Valid range is -1 to 99999 seconds.

    /NOBREAK                Ignore key presses and wait specified time.

    /?                      Displays this help message.

NOTE: A timeout value of -1 means to wait indefinitely for a key press.

Examples:
    TIMEOUT /?
    TIMEOUT /T 10
    TIMEOUT /T 300 /NOBREAK
    TIMEOUT /T -1

Not: Giriş yeniden yönlendirmesi ile çalışmaz - önemsiz örnek:

C:\>echo 1 | timeout /t 1 /nobreak
ERROR: Input redirection is not supported, exiting the process immediately.

8
konsolsuz kullanımlarda çalışmaz: "HATA: Giriş yeniden yönlendirmesi desteklenmiyor, işlemden hemen çıkıyor."
simpleuser

Böyle toplu iş dosyası diğer bazı sürecinden bir çatal, bir cygwin crontab veya uzaktan ssh komutu aracılığıyla vb arka planda çalıştırıldığında gibi hiç bir konsol yok vakaları, demek
simpleuser

1
Oh evet biliyorum.
Verdiğim

3
Bağlantı belgelerine timeout@Cristian Ciupitu tarafından eklenen, kısmen yanlıştır - Windows XP bu komutu yoktur.
martineau

1
@HelloWorld% PATH%
Blorgbeard

21

Belirtildiği gibi pingyöntemi kullanmak, daha fazla yürütülebilir dosya ekleyemediğimde veya başka bir yazılım yükleyemediğimde bunu nasıl yaptığımdır.

Orada olmayan bir şeye ping atmalı ve -wbayrağı, o zamandan sonra başarısız olacak şekilde kullanmalısınız , orada olan bir şeye (localhost gibi) pingleme yapmamalısınız -n. Bu, zamanı bir saniyeden daha kısa sürede ele almanızı sağlar ve bence biraz daha doğru.

Örneğin

(1.1.1.1'in alınmadığını test edin)

ECHO Waiting 15 seconds

PING 1.1.1.1 -n 1 -w 15000 > NUL
  or
PING -n 15 -w 1000 127.1 >NUL

Anında geri dönerPING: transmit failed. General failure.
huysentruitw

IP 1.1.1.1, CloudFlare tarafından alınır;
dhcgn

16

SLEEP.exeçoğu Kaynak Setinde bulunur, örneğin Windows XP'ye de yüklenebilen Windows Server 2003 Kaynak Seti .

Usage:  sleep      time-to-sleep-in-seconds
        sleep [-m] time-to-sleep-in-milliseconds
        sleep [-c] commited-memory ratio (1%-100%)

15

Burada bulduğum cevaplara katılmıyorum.

Bir toplu iş dosyasında gecikme yapmak için tamamen Windows XP yeteneklerine dayalı olarak aşağıdaki yöntemi kullanıyorum:

DELAY.BAT:

@ECHO OFF
REM DELAY seconds

REM GET ENDING SECOND
FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, ENDING=(H*60+M)*60+S+%1

REM WAIT FOR SUCH A SECOND
:WAIT
FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, CURRENT=(H*60+M)*60+S
IF %CURRENT% LSS %ENDING% GOTO WAIT

Ayrıca, hesaplamada günü de ekleyebilirsiniz, böylece gecikme aralığı gece yarısından geçtiğinde yöntem de çalışır.


15
Bu doğru olmalı, ancak bunun için CPU yoğun bir yol. Normalde, işlemin beklerken CPU döngülerini tüketmemesi için kesintiye dayalı bir uygulama istersiniz. Muhtemelen çoğu parti durumunda olduğu gibi, bu durum nadiren kısa bekleme için bir sorun olmamalıdır. Ancak sürekli olarak uzun süre çalışan bir işlemin sistem performansı üzerinde olumsuz bir etkisi olabilir.
dbenham

4
Sistem saatini kullandığından doğruluk bir saniyedir. 2 saniye belirtilirse, gecikme 2 saniye ile 3 saniye arasında olabilir (aslında 2.99999 ... saniye).
Peter Mortensen

Ya şimdi saat 7:59:59 ise ve 7 saniye beklemek istiyorsan? Bu dikkate almıyor gibi görünüyor.
ashes999

Bu, sistem süresini saydığından daha fazla CPU zamanı tüketir. Buna ek olarak sekizli sayılarla aritmetik işlemler yapıyorsunuz, çünkü 10'dan küçük dakikalar ve saniyeler TIMEkomutta önde 0 ile gösteriliyor .
Andreas

2
@mrt: Sorun, %TIME%nokta yerine santisaniyeleri ayırmak için virgül kullanmanızdır! Sadece bir virgül ekleyin DELIMS=:.,"...
Aacini

13

Benzer bir sorunla karşı karşıya kaldım, ama aynı şeyi yapmak için çok kısa bir C ++ konsol uygulamasını devirdim. Sadece MySleep.exe 1000'i çalıştırın - belki de tüm kaynak kitini indirmek / kurmaktan daha kolaydır.

#include <tchar.h>
#include <stdio.h>
#include "Windows.h"

int _tmain(int argc, _TCHAR* argv[])
{
    if (argc == 2)
    {
        _tprintf(_T("Sleeping for %s ms\n"), argv[1]);
        Sleep(_tstoi(argv[1]));
    }
    else
    {
        _tprintf(_T("Wrong number of arguments.\n"));
    }
    return 0;
}

10

Sunucu Hatası'nda benzer bir soru soruldu ve çözüm şuydu:

choice /d y /t 5 > nul

7
Bilginize: Seçim Windows XP'de bulunmaz. Windows 9x'teydi, XP'den kaldırıldı ve Vista'ya geri eklendi.
Devin Burke

7
Bunu hiç tavsiye etmiyorum. En azından CHOICEbildiğim tüm versiyonlarda, birisi beklerken bir düğmeye basarsa, hangi sabırsız insanlar bazen yaparsa, seçim bir giriş kaydeder, kötü bir giriş için bir sistem bip sesi verir ve geri sayım sayacını durdurur, bu da askıda kalacağı anlamına gelir N ya da Y'yi itmedikçe ve eğer bu ikisinden birini zorlarlarsa, seçim 5'i beklemek yerine orada biter. Ayrıca, bu seçenek gerçekten garip Vista sözdizimini kullanıyor. Bunun yerine tüm normal seçim komutları kullanılır CHOICE /T:Y,5 > NUL. /DEski sürümlerde bayrak yok .
Stille Kodlama

1
En azından, bildiğim CHOICE komutları, geldiği dile göre farklı varsayılan evet / hayır düğmelerine sahip, bu yüzden açıkça /C:YNveya sadece ile belirtmek yerine varsayılan bir [Y, N] seçeneğine güvenirseniz /C:Y, birisi muhtemelen varsayılan olarak [J, N] yapacak bir İsveç seçim komutuna sahip olduğunda bu işe yaramayacaktır. Yani bu her tür beladan kaynaklanıyor.
Stille Kodlama

1
@Coding Bunu Win7'de test etti ve kullanıcı bir düğmeye basarsa bip sesi çıkarır, ancak kullanıcı bir düğmeye bastıktan 5 saniye sonra yine zaman aşımına uğrar. Dolayısıyla kullanıcı tuşlara basmaya devam ederse, asla zaman aşımı olmaz. Ayrıca, benim durumumda, bunu kullandığımda, konsolun gizleneceğine inanıyorum, böylece kullanıcı düğmeye basamıyordu. Bu sistemde, Python'a erişim yoktu, kendi exe'mi sisteme bırakmak için erişim yoktu (diğer bazı cevaplarda önerildiği gibi), yapabileceğim şeyle oldukça sınırlıydım. Peki, ne önerirsiniz?
mlsteeves

@mlsteeves Her farklı Windows, DOS vb. farklı bir seçim komutuna sahiptir ve belirtildiği gibi normalde Xp'de bulunmaz. Birçok seçim komutunun ustaca farklı davranışları vardır ve hatta bazıları farklı sözdizimine sahiptir. Ben, genellikle uykuya ihtiyacım olduğunda ping komutunu kullanıyorum. Çirkin ama güvenilir.
Stille Kodlama

9

Windows cscript WSH katmanını ve bu wait.js JavaScript dosyasını kullanabilirsiniz:

if (WScript.Arguments.Count() == 1)
    WScript.Sleep(WScript.Arguments(0)*1000);
else
    WScript.Echo("Usage: cscript wait.js seconds");

1
Windows Komut Dosyası Ana Bilgisayarı grup ilkeleri aracılığıyla devre dışı bırakılabilir.
Joey

8

Uyumluluk gereksinimlerinize bağlı olarak aşağıdakilerden birini kullanın ping:

ping -n <numberofseconds+1> localhost >nul 2>&1

5 saniye beklemek için

ping -n 6 localhost >nul 2>&1

veya Windows 7 veya sonraki sürümlerde timeoutşunları kullanın :

timeout 6 >nul

2
-wmilisaniye cinsindendir, -nyalnızca ping sayısıdır ve pingler arasındaki varsayılan süre bir saniyedir.
Joey

8

Ping kullanabilirsiniz:

ping 127.0.0.1 -n 11 -w 1000 >nul: 2>nul:

10 saniye bekleyecek.

11'i kullanmanızın nedeni, ilk pingin bir saniye sonra değil, hemen sönmesidir. Sayı her zaman beklemek istediğiniz saniye sayısından bir daha fazla olmalıdır.

Unutmayın ki amacı -wbir saniye beklemek değildir. Ağ sorunları olması durumunda bir saniyeden fazla beklememenizi sağlamaktır . pingkendi başına saniyede bir ICMP paketi gönderir. Muhtemelen localhost için gerekli değildir, ancak eski alışkanlıklar zor ölmektedir.


kritik gerçek zamanlı işleme için kullanılması önerilmez. PING komutu kullanıldığından, bu WAIT toplu iş dosyasının birkaç milisaniye üzerinde çalışabilmesi mümkündür
Wael Dalloul

12
@Wael, eğer bir saniyelik sınırları bekliyorsanız, birkaç milisaniye önemsiz olacaktır. Ve gerçek zamanlı şeyler için cmd.exe kullanıyorsanız, aldığınız her şeyi hak ediyorsunuz :-)
paxdiablo

-w bir zaman aşımı değeridir. Bir cevap için beklenecek milisaniye sayısı ... pingler arasında beklenecek süre değil .
quux

@quux, hiçbir yerde -wzaman aşımı olduğunu belirtmedim (bazılarının netlik eksikliğimden dolayı çıkarımda bulunabileceğini itiraf etmeliyim), aslında her döngünün tahsisinden daha fazlasını almasına neden olacak ağ sorunlarının olduğu döngü süresini sınırlamak için kullanılır ikinci. Bunu netleştirmek için sonuna bir paragraf ekledim.
paxdiablo

Sorun, pingler daha hızlı dönerse , pingler arasında bir saniye beklemeyebilirsiniz. böylece bekleme
döngünüz

7

Ping kullanarak uyumak için daha iyi bir yol var. Var olmayan bir adrese ping atmak isteyeceksiniz, böylece milisaniye hassasiyetinde bir zaman aşımı belirleyebilirsiniz. Neyse ki, böyle bir adres bir standartta tanımlanır (RFC 3330) ve öyle 192.0.2.x. Bu uydurulmuş değil, gerçekten sadece var olmayan amacı olan bir adres (açık olmayabilir, ancak yerel ağlarda bile geçerlidir):

192.0.2.0/24 - Bu blok, dokümantasyonda ve örnek kodda kullanılmak üzere "TEST-NET" olarak atanmıştır. Genellikle satıcı ve protokol belgelerinde example.com veya example.net alan adları ile birlikte kullanılır. Bu bloktaki adresler genel İnternet'te görünmemelidir.

123 milisaniye uyumak için ping 192.0.2.1 -n 1 -w 123 >nul


Evet, bunu yazmak zorunda kaldıkları için daha anlamak kolaydır tane ekleyin için -nparametre.
Peter Mortensen

Ancak, ölçtüm (100 ping kullanarak). -N 3 -w 124 kullanırsam, gerçek zaman tam olarak (3 + 1) * (124 + 1) = 4 * 125 = 500 ms'dir. Zamanlama, okumadaki 10 ms'lik çözünürlüğe tam olarak (zamana sahip bir CMD istemiyle) tam olarak sabittir - ve alttaki çözünürlük kesinlikle 10 ms'den daha iyidir (normal 16 ms'lik kene çözünürlüğünden etkilenmez).
Peter Mortensen

@mafu 192.0.2.0/24 kullanılmaması gerektiği, bunun kullanılamayacağı anlamına gelmez ve bu nedenle yankı istek (ler) i üzerinde hiçbir yanıtın bulunmadığı garanti edilmez. Örneğin, herhangi bir Windows PC için 192.0.2.1 statik IPv4 adresini ve 255.255.255.0 alt ağ maskesini yapılandırın ve ağ bağdaştırıcısını başka bir aygıta bağlayın. Başka hiçbir şeyin bağlı olmadığı basit bir anahtar yeterlidir. Sonra ping 192.0.2.1bu Windows PC'de çalıştırın ve Windows TCP / IP yığının yankı isteklerine yanıt verdiği görülebilir. Kaç kişi 192.0.2.0/24'ün statik bir IPv4 adresi için kullanılmaması gerektiğini biliyor?
Mofi

1
Buradaki yorumlara göre , 192.0.2.1'in kusursuz olmadığını ve bazılarının 127.255.255.255'in daha iyi bir seçim olduğunu öne sürdüğü anlaşılıyor. Düşünceler?
JLRishe

Yukarıdaki gönderide bahsedilen yorumlar kaldırıldı (muhtemelen NLN olarak), ancak 127.255.255.255Windows'ta zaten varsayılan olarak atanmış olan bir yayın geri döngü adresi olması nedeniyle bu değişikliği kabul ediyorum (Bunu çalıştırarak onaylayabilirsiniz route print. cmd ve yazdırdığı IPv4 yol tablosuna bakarak).
Hoppeduppeanut

6

Eğer var ise PowerShell sisteminizde, sadece bu komutu çalıştırabilirsiniz:

powershell -command "Start-Sleep -s 1"

Düzenleme: Benzer bir iş parçacığındaki cevabımdan , insanlar powershell'in başlaması için geçen sürenin ne kadar beklemeye çalıştığınıza kıyasla önemli olduğu bir sorun ortaya çıkardı . Bekleme süresinin doğruluğu önemliyse (örneğin, bir veya iki ekstra gecikme kabul edilemez), bu yaklaşımı kullanabilirsiniz:

powershell -command "$sleepUntil = [DateTime]::Parse('%date% %time%').AddSeconds(5); $sleepDuration = $sleepUntil.Subtract((get-date)).TotalMilliseconds; start-sleep -m $sleepDuration"

Bu, windows komutunun verildiği zamanı alır ve powershell betiği bu süreden 5 saniye sonrasına kadar uyur. Powershell'in uyku sürenizden başlaması daha az zaman aldığı sürece, bu yaklaşım işe yarayacaktır (makinemde 600ms civarında).


6
timeout /t <seconds> <options>

Örneğin, komut dosyasının kesintisiz 2 saniyelik bir bekleme gerçekleştirmesini sağlamak için:

timeout /t 2 /nobreak >NUL

Bu, komut dosyasının devam etmeden önce 2 saniye bekleyeceği anlamına gelir.

Varsayılan olarak, bir tuş vuruşu zaman aşımını kesintiye uğratacaktır, bu nedenle /nobreakkullanıcının beklemeyi yarıda kesmesini (iptal etmesini) istemiyorsanız anahtarı kullanın . Ayrıca, zaman aşımı, kullanıcıya ne kadar bekleyeceğini bildirmek için saniyede bir bildirim gönderir; bu komut, komutunu pipete ederek kaldırılabilir NUL.

düzenleme: As @martineau açıklamalarda işaret , timeoutkomut yukarıdaki Windows 7 ve üzerinde kullanılabilir. Ayrıca, pingkomut daha az işlemci süresi kullanır timeout. Yine de timeoutmümkün olan yerlerde kullanmaya inanıyorum , çünkü ping'hack'ten daha okunabilir . Daha fazlasını buradan okuyun .


2
Görünüşe göre bu komut sadece Windows 7/2008 ve XP Resource Kit'te (ve muhtemelen 8 / 8.1'de) mevcuttur. Kaynak ayrıca pingyaklaşımın daha az işlemci süresi kullandığını iddia ediyor .
martineau

5

Bunu toplu iş dosyanıza beklemek istediğiniz yere koyun.

@ping 127.0.0.1 -n 11 -w 1000 > null

Bu paxdiablo'nun cevabından farkı nedir?
Peter Mortensen

2
Farklı değil, ama buradaki cevaplar çoklu birleştirilmiş sorulardan geliyor, bu yüzden cevap verdiğimde tüm cevaplar mevcut değildi.
Brent Stewart

4

Not Defteri'nde şunu yazın:

@echo off
set /a WAITTIME=%1+1
PING 127.0.0.1 -n %WAITTIME% > nul
goto:eof

Şimdi C: \ WINDOWS \ System32 klasörüne wait.bat olarak kaydedin, daha sonra beklemek istediğinizde şunu kullanın:

CALL WAIT.bat <whole number of seconds without quotes>

Her ping arasında bir saniye bekleyen kendini tekrar tekrar pingler ve sonra çağrı programına geri döner, sonsuz döngüyü görmüyorum, ama kendim test ettim.
SuperKael

Benim hatam, sonsuz bir döngü yok. Bununla birlikte, diğer cevaplardan birinde belirtildiği gibi , pingsadece bir kez değil , bir şey için daha iyidir -w Timeoutve gecikme süresi seçeneğini -n Counttüm yeniden deneme sayısı seçeneği yerine milisaniye cinsinden kullanın.
martineau

-w Timeoutdaha iyi olabilir, ama ben girilen zamandan bir kez daha ping emin olun.
SuperKael

4

Kaynak Seti hep bu yer verdi. En azından Windows 2000'den beri.

Ayrıca, Cygwin paketinin sleepPATH'nize bir - plop'u vardır ve cygwin.dll(veya ne denirse) ve gitme yolunu içerir!


2
Cygwin1.dll dosyasının kendisinin farklı sürümleriyle barış içinde bir arada bulunmadığını unutmayın. Makinenizde bir ve yalnızca bir cygwin1.dll dosyası varsa iyi olur, yoksa garip hatalar alırsınız.
JesperE

Hangi Kaynak Seti? Birden fazla var gibi görünüyor. Cevabınızı güncelleyebilir misiniz?
Peter Mortensen

3

Aacini'nin yanıtını seviyorum . Ben gün işlemek ve ayrıca santisaniye ( %TIME%çıkışlar H:MM:SS.CC) işlemek için ekledi :

:delay
SET DELAYINPUT=%1
SET /A DAYS=DELAYINPUT/8640000
SET /A DELAYINPUT=DELAYINPUT-(DAYS*864000)

::Get ending centisecond (10 milliseconds)
FOR /F "tokens=1-4 delims=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, X=1%%D%%100, ENDING=((H*60+M)*60+S)*100+X+DELAYINPUT
SET /A DAYS=DAYS+ENDING/8640000
SET /A ENDING=ENDING-(DAYS*864000)

::Wait for such a centisecond
:delay_wait
FOR /F "tokens=1-4 delims=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, X=1%%D%%100, CURRENT=((H*60+M)*60+S)*100+X
IF DEFINED LASTCURRENT IF %CURRENT% LSS %LASTCURRENT% SET /A DAYS=DAYS-1
SET LASTCURRENT=%CURRENT%
IF %CURRENT% LSS %ENDING% GOTO delay_wait
IF %DAYS% GTR 0 GOTO delay_wait
GOTO :EOF

3

Bu C # uyku programını kullanıyorum. C # tercih ettiğiniz dilse sizin için daha uygun olabilir:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace sleep
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 1)
            {
                double time = Double.Parse(args[0]);
                Thread.Sleep((int)(time*1000));
            }
            else
            {
                Console.WriteLine("Usage: sleep <seconds>\nExample: sleep 10");
            }
        }
    }
}

3

Python çözümünden bile daha hafif bir Perl tek astarlıdır.

Yedi saniye uyumak için bunu BAT betiğine koyun:

perl -e "sleep 7"

Bu çözüm yalnızca bir saniyelik bir çözünürlük sağlar.

Daha yüksek çözünürlüğe ihtiyacınız varsa, CPAN'dan Time :: HiRes modülünü kullanın. Sağladığı usleep()mikrosaniye uyur olan ve nanosleep()(her iki fonksiyonun sadece argümanlar tamsayıdır taşır) nanosaniye uyur. Yığın Taşması sorusuna bakın Perl'de bir milisaniye nasıl uyurum? daha fazla detay için.

Ben kullandım ActivePerl yıllardır. Kurulum çok kolaydır.


2

Veya komut satırı Python, örneğin 6 buçuk saniye:

python -c "import time;time.sleep(6.5)"

Daha kısa olmasına rağmen, bu kabul edilen cevabın bir kopyasıdır.
Peter Mortensen

@Peter Mortensen: Ayrıca, her şeyi bir toplu iş dosyasının tek bir satırına kolayca koymanızı sağlar.
martineau

2

Kullanım ping "biraz bekle" için sürece sadece istediğiniz kadar iyidir. Bu, ağınızın çalışması ve 127.0.0.1'de cevap veren hiçbir şey olmaması gibi altındaki diğer işlevlere bağımlı olduğunuz için. ;-) Belki başarısız olması pek olası değildir, ancak imkansız değildir ...

Tam olarak belirtilen süreyi beklediğinizden emin olmak istiyorsanız, sleep işlevselliği (bu da CPU gücünü kullanmaması veya bir ağın hazır olmasını beklemesi avantajına sahiptir).

Zaten uyku için çalıştırılabilir bir bulmak için en uygun yoldur. Sadece Windows klasörünüze veya standart yolunuzun herhangi bir bölümüne bırakın ve her zaman kullanılabilir.

Aksi takdirde, derleme ortamınız varsa kolayca kendiniz yapabilirsiniz. SleepFonksiyon mevcuttur kernel32.dllsadece o birini kullanmak gerekir, böylece. :-) VB / VBA için, uyku işlevini bildirmek üzere kaynağınızın başında aşağıdakileri beyan edin:

private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (byval dwMilliseconds as Long)

C # için:

[DllImport("kernel32.dll")]
static extern void Sleep(uint dwMilliseconds);

Uyku işlevinde bu işlev hakkında (Windows 2000'den beri kullanılabilir) daha fazla bilgi bulabilirsiniz. (MSDN) .

Standart C'de, sleep()standart kitaplığa dahil edilir ve Microsoft'un Visual Studio C'sinde Sleep(), bellek bana hizmet veriyorsa işlev adlandırılır . ;-) Bu ikisi, önceki iki deklarasyon olarak milisaniye olarak değil, saniyeler içinde tartışır.


1
Uyku .net çerçevesinde mevcuttur - iş parçacığı sınıfına bir göz atın, örneğin: using System.Threading; .... İplik. Uyku (1000);
John Sibly

2
"Ping 127.0.0.1" başarısız olursa, endişelenmek için "uyku" dan daha ciddi şeyler var - bu geri döngü arayüzü, RPC muhtemelen delirecek bir şey.
Piskvor

2

Windows 2000'den sonra tüm Windows sürümlerinde çalışması gereken en iyi çözüm:

timeout numbersofseconds /nobreak > nul

XP Pro üzerinde çalışmıyor ...'timeout' is not recognized as an internal or external command, operable program or batch file.
martineau

1

Pathping.exe saniyeden daha az uyuyabilir.

@echo off
setlocal EnableDelayedExpansion 
echo !TIME! & pathping localhost -n -q 1 -p %~1 2>&1 > nul & echo !TIME!

.

> sleep 10
17:01:33,57
17:01:33,60

> sleep 20
17:03:56,54
17:03:56,58

> sleep 50
17:04:30,80
17:04:30,87

> sleep 100
17:07:06,12
17:07:06,25

> sleep 200
17:07:08,42
17:07:08,64

> sleep 500
17:07:11,05
17:07:11,57

> sleep 800
17:07:18,98
17:07:19,81

> sleep 1000
17:07:22,61
17:07:23,62

> sleep 1500
17:07:27,55
17:07:29,06

1

Ben bundan etkilendim:

http://www.computerhope.com/batch.htm#02

choice /n /c y /d y /t 5 > NUL

Teknik olarak, choicekomuttan yalnızca y kabul etmesini söylüyorsunuz . Varsayılan olarak y, 5 saniye içinde bunu yapmak, istem istememek ve söylediği her şeyi NUL'a (Linux'ta null terminal gibi) dökmek.


3
Burada kendimi yankılayacağım: Bunu hiç tavsiye etmiyorum. Gelen CHOICEbirisi Y. itmek sürece askıda kalacaktır kadar sabırsız millet bazen, o zaman seçim, sayım, bir giriş okumak kötü bir giriş için bir sistem bip verir ve durur do beklerken bir anahtar, vurursa sürümleri biliyorum, Ve eğer Y'yi zorlarlarsa, seçim 5'i beklemek yerine orada biter. Ayrıca, bu seçenek gerçekten garip Vista sözdizimini kullanıyor. Bunun yerine normal seçim komutları kullanılır CHOICE /T:Y,5 > NUL. (Eski sürümlerde / D bayrağı yoktur.) Ve Vista'nız varsa TIMEOUTbunun yerine kullanın.
Stil ile Kodlama

1

Belirli zaman aşımlarını yapmak için bir .vbs dosyası da kullanabilirsiniz:

Aşağıdaki kod .vbs dosyasını oluşturur. Bunu rabatch kodunuzun en üstüne koyun:

echo WScript.sleep WScript.Arguments(0) >"%cd%\sleeper.vbs"

Daha sonra aşağıdaki kod .vbs dosyasını açar ve ne kadar bekleyeceğini belirtir:

start /WAIT "" "%cd%\sleeper.vbs" "1000"

Yukarıdaki kodda, "1000" .vbs dosyasına milisaniye olarak gönderilecek zaman gecikmesi değeridir, örneğin 1000 ms = 1 s. Bu parçayı istediğiniz kadar uzun süre değiştirebilirsiniz.

Aşağıdaki kod, işiniz bittiğinde .vbs dosyasını siler. Bunu toplu iş dosyanızın sonuna koyun:

del /f /q "%cd%\sleeper.vbs"

İşte kod hep birlikte bu yüzden kopyalamak kolaydır:

echo WScript.sleep WScript.Arguments(0) >"%cd%\sleeper.vbs"
start /WAIT "" "%cd%\sleeper.vbs" "1000"
del /f /q "%cd%\sleeper.vbs"

1

Windows Vista'dan TIMEOUT ve SLEEP komutlarınız var, ancak bunları Windows XP veya Windows Server 2003'te kullanmak için Windows Server 2003 kaynak araç kitine ihtiyacınız olacak .

Burada uyku alternatiflerine iyi bir genel bakışınız var (ping yaklaşımı her Windows makinesinde çalışacağı için en popüler olanıdır), ancak (en azından) hangi (ab) 'nin W32TM(Zaman Hizmeti) komutunu kullandığı belirtilmemiştir (en azından) :

w32tm /stripchart /computer:localhost /period:1 /dataonly /samples:N  >nul 2>&1

N'yi duraklatmak istediğiniz saniye ile değiştirmelisiniz. Ayrıca, önkoşullar olmadan her Windows sisteminde çalışacaktır.

Typeperf ayrıca kullanılabilir:

typeperf "\System\Processor Queue Length" -si N -sc 1 >nul

Mshta ve javascript ile (bir saniyenin altında uyku için kullanılabilir):

start "" /wait /min /realtime mshta "javascript:setTimeout(function(){close();},5000)"

Bu daha da kesin olmalıdır (bir saniyenin altında beklemek için) - kendi kendini derleyen yürütülebilir dosya aşağıdakilere dayanarak .net:

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal
::del %~n0.exe /q /f
::
:: For precision better call this like
:: call waitMS 500
:: in order to skip compilation in case there's already built .exe
:: as without pointed extension first the .exe will be called due to the ordering in PATEXT variable
::
::
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)

if not exist "%~n0.exe" (
    "%jsc%" /nologo /w:0 /out:"%~n0.exe" "%~dpsfnx0"
)


%~n0.exe %*

endlocal & exit /b %errorlevel%


*/


import System;
import System.Threading;

var arguments:String[] = Environment.GetCommandLineArgs();
function printHelp(){
    Console.WriteLine(arguments[0]+" N");
    Console.WriteLine(" N - milliseconds to wait");
    Environment.Exit(0);    
}

if(arguments.length<2){
    printHelp();
}

try{
    var wait:Int32=Int32.Parse(arguments[1]);
    System.Threading.Thread.Sleep(wait);
}catch(err){
    Console.WriteLine('Invalid Number passed');
    Environment.Exit(1);
}

1

Cmd / toplu işte bir ' uyku ' gerçekleştirmenin birçok yolu vardır :

Benim favorim:

TIMEOUT /NOBREAK 5 >NUL 2>NUL

Bu, herhangi bir çıkış olmadan konsolu 5 saniye durduracaktır.

En çok kullanılan:

ping localhost -n 5 >NUL 2>NUL

Bu, localhost5 kez bağlantı kurmaya çalışacaktır . Bilgisayarınızda barındırıldığından, her zaman ana bilgisayara ulaşacaktır, bu nedenle her saniye yeniyi her saniye dener. -nBayrak komut bağlantısını dener kaç kez belirtir. Bu durumda 5'tir, bu yüzden 5 saniye sürecektir.

Sonuncunun varyantları:

ping 1.1.1.1 -n 5 >nul

Bu senaryoda, sonuncusuyla karşılaştıran bazı farklılıklar vardır. Bu aramaya çalışmaz localhost. Bunun yerine, 1.1.1.1çok hızlı bir web sitesine bağlanmaya çalışacaktır . Eylem yalnızca etkin bir İnternet bağlantınız varsa 5 saniye sürer . Aksi takdirde eylemi tamamlamak yaklaşık 15 sürer . Bu yöntemi kullanmanızı önermiyorum.

ping 127.0.0.1 -n 5 >nul

Bu, örnek 2 (en çok kullanılan) ile tamamen aynıdır. Ayrıca şunları da kullanabilirsiniz:

ping [::1] -n 5 >nul

Bunun yerine IPv6'nın localhostsürümünü kullanır .

Bu eylemi gerçekleştirmek için birçok yöntem vardır. Ancak, Windows Vista ve sonraki sürümleri için yöntem 1'i ve işletim sisteminin önceki sürümleri için en çok kullanılan yöntemi (yöntem 2) tercih ederim.


0

PAUSE mesajını başlık çubuğuna koyarak süsleyebilirsiniz:

@ECHO off
SET TITLETEXT=Sleep
TITLE %TITLETEXT%
CALL :sleep 5
GOTO :END
:: Function Section
:sleep ARG
ECHO Pausing...
FOR /l %%a in (%~1,-1,1) DO (TITLE Script %TITLETEXT% -- time left^
 %%as&PING.exe -n 2 -w 1000 127.1>NUL)
EXIT /B 0
:: End of script
:END
pause
::this is EOF

0

Bu, Windows XP SP3 ve Windows 7'de test edildi ve CScript kullanıyor. Ben "" sormadan kaçınmak için bazı güvenli korumalar koymak. (/q tehlikeli olurdu)

Bir saniye bekle:

sleepOrDelayExecution 1000

500 ms bekleyin ve ardından şu öğeleri çalıştırın:

sleepOrDelayExecution 500 dir \ /s

sleepOrDelayExecution.bat:

@echo off
if "%1" == "" goto end
if NOT %1 GTR 0 goto end
setlocal
set sleepfn="%temp%\sleep%random%.vbs"
echo WScript.Sleep(%1) >%sleepfn%
if NOT %sleepfn% == "" if NOT EXIST %sleepfn% goto end
cscript %sleepfn% >nul
if NOT %sleepfn% == "" if EXIST %sleepfn% del %sleepfn%
for /f "usebackq tokens=1*" %%i in (`echo %*`) DO @ set params=%%j
%params%
:end

0

Diğerleri üçüncü taraf programlar önerdiğinden (Python, Perl, özel uygulama vb.) Başka bir seçenek de Windows için GNU CoreUtils http://gnuwin32.sourceforge.net/packages/coreutils.htm adresinde bulunmaktadır. .

Dağıtım için 2 seçenek:

  1. Tam paketi yükleyin (tam CoreUtils paketini, bağımlılıkları, belgeleri vb. İçerir).
  2. Yalnızca 'sleep.exe' ikili dosyasını ve gerekli bağımlılıkları yükleyin (bağımlılıkları almak için depends.exe'yi kullanın).

CoreUtils'i dağıtmanın bir yararı, ek olarak komut dosyası oluşturmaya yardımcı olan bir dizi başka programa sahip olmanızdır (Windows toplu işi arzulanan çok şey bırakıyor).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.