يمكن لأداة Snipping من Windows التقاط الشاشة ، لكن في بعض الأحيان أرغب في التقاط الشاشة بعد 5 ثوانٍ ، مثل التقاط صورة يتم عرضها بواسطة كاميرا الويب. (قم بتشغيل البرنامج النصي وابتسم على الكاميرا ، على سبيل المثال).
سؤالي هو: كيف تنام لمدة 5 ثوانٍ في ملف دفعي؟
أحد الاختراقات هو (mis) استخدام الأمر ping:
ping 127.0.0.1 -n 6 > nul
تفسير:
ping
هو أداة مساعدة للنظام ترسل طلبات ping. ping
متاح في جميع إصدارات Windows.127.0.0.1
هو عنوان IP الخاص بـ localhost . عنوان IP هذا مضمون لحله دائمًا ، ويمكن الوصول إليه ، والرد الفوري على الأصوات.-n 6
يحدد أنه يجب أن يكون هناك 6 أصوات. هناك تأخير لمدة دقيقة واحدة بين كل اختبار ping ، لذلك تحتاج إلى إرسال 6 أصوات للتأخير لمدة 5 ثوان.> nul
منع إخراج ping
، بواسطة إعادة التوجيه إلى nul
.أنا مندهش جدًا ولم يذكرها أحد:
C:\> timeout 5
N. يرجى ملاحظة (شكرا دان!) أن timeout 5
تعني:
النوم في أي مكان بين 4 و 5 ثوان
يمكن التحقق من ذلك بشكل تجريبي عن طريق وضع ما يلي في ملف دفعي ، وتشغيله بشكل متكرر وحساب الفوارق الزمنية بين echo
s الأول والثاني:
@echo off
echo %time%
timeout 5 > NUL
echo %time%
جرب اختيار الأمر. لقد كانت موجودة منذ MSDOS 6.0 ، وينبغي أن تفعل الخدعة.
استخدم المعلمة/T لتحديد المهلة بالثواني والمعلمة/D لتحديد التحديد الافتراضي وتجاهل ثم الاختيار المحدد.
الشيء الوحيد الذي قد يكون مشكلة هو إذا قام المستخدم بكتابة أحد أحرف الاختيار قبل انقضاء فترة المهلة. الحل البديل الجزئي هو تعميق الموقف - استخدم وسيطة/N لإخفاء قائمة الخيارات الصالحة ولديه حرف واحد فقط في مجموعة الاختيارات ، وبالتالي سيكون من المحتمل أن يكتب المستخدم اختيارًا صالحًا قبل انتهاء المهلة.
يوجد أدناه نص التعليمات على نظام التشغيل Windows Vista. أعتقد أن هذا هو نفسه على نظام XP ، لكن انظر إلى نص التعليمات على جهاز كمبيوتر [XP) للتحقق.
C:\>CHOICE /?
CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]
Description:
This tool allows users to select one item from a list
of choices and returns the index of the selected choice.
Parameter List:
/C choices Specifies the list of choices to be created.
Default list is "YN".
/N Hides the list of choices in the Prompt.
The message before the Prompt is displayed
and the choices are still enabled.
/CS Enables case-sensitive choices to be selected.
By default, the utility is case-insensitive.
/T timeout The number of seconds to pause before a default
choice is made. Acceptable values are from 0 to
9999. If 0 is specified, there will be no pause
and the default choice is selected.
/D choice Specifies the default choice after nnnn seconds.
Character must be in the set of choices specified
by /C option and must also specify nnnn with /T.
/M text Specifies the message to be displayed before
the Prompt. If not specified, the utility
displays only a Prompt.
/? Displays this help message.
NOTE:
The ERRORLEVEL environment variable is set to the index of the
key that was selected from the set of choices. The first choice
listed returns a value of 1, the second a value of 2, and so on.
If the user presses a key that is not a valid choice, the tool
sounds a warning beep. If tool detects an error condition,
it returns an ERRORLEVEL value of 255. If the user presses
CTRL+BREAK or CTRL+C, the tool returns an ERRORLEVEL value
of 0. When you use ERRORLEVEL parameters in a batch program, list
them in decreasing order.
Examples:
CHOICE /?
CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."
CHOICE /T 10 /C ync /CS /D y
CHOICE /C ab /M "Select a for option 1 and b for option 2."
CHOICE /C ab /N /M "Select a for option 1 and b for option 2."
الاختراق التالي يتيح لك النوم لمدة 5 ثوانٍ
ping -n 6 127.0.0.1 > nul
نظرًا لأن ping ينتظر ثانية بين الأصوات ، يجب عليك تحديد واحدة أكثر مما تحتاج.
إذا كان لديك PowerShell على نظامك ، يمكنك فقط تنفيذ هذا الأمر:
powershell -command "Start-Sleep -s 5"
تحرير: أثار الأشخاص مشكلة حيث يكون مقدار الوقت الذي تستغرقه عملية بدء powerhell كبيرًا مقارنةً بالوقت الذي تحاول أن تنتظره. إذا كانت دقة وقت الانتظار مهمة (أي أن التأخير الإضافي الثاني أو الثاني غير مقبول) ، يمكنك استخدام هذه الطريقة:
powershell -command "$sleepUntil = [DateTime]::Parse('%date% %time%').AddSeconds(5); $sleepDuration = $sleepUntil.Subtract((get-date)).TotalMilliseconds; start-sleep -m $sleepDuration"
يستغرق هذا الوقت الذي تم فيه إصدار الأمر windows ، وينام البرنامج النصي powerhell حتى 5 ثوانٍ بعد ذلك الوقت. طالما أن استخدام بوويرشيل يستغرق وقتًا أقل من مدة نومك ، فستعمل هذه الطريقة (حوالي 600 مللي ثانية على الجهاز الخاص بي).
يمكنك جعله مع timeout
:
سيكون هذا مرئيًا: timeout 5
لن يكون هذا مرئيًا timeout 5 >nul
لا يمكننا أن نفعل waitfor /T 180
؟
waitfor /T 180 pause
سيؤدي إلى "خطأ: انتهت مهلة انتظار" توقف "."
waitfor /T 180 pause >nul
سوف يكتسح هذا "الخطأ" تحت السجادة
يجب أن يكون الأمر waitfor
موجودًا في نظام التشغيل Windows بعد Win95
في الماضي قمت بتنزيل ملف قابل للتنفيذ باسم sleep
يعمل على سطر الأوامر بعد وضعه في طريقك.
على سبيل المثال: sleep shutdown -r -f /m \\yourmachine
بالرغم من أن إيقاف التشغيل الآن به خيار مدمج
Timeout /t 1 >nul
يشبه التوقف المؤقت في ثانية واحدة ، يمكنك أن تأخذ ما يقرب من 100.000 (99.999) ثانية. إذا كنت متصلاً بالإنترنت ، فإن أفضل حل هو:
ping 1.1.1.1. -n 1 -w 1000 >nul
عند إجراء اختبار ping لك بالمللي ثانية ، ستكون ثانية واحدة 1000 مللي ثانية. لكن الأمر ping قليل التافه ، فهو لا يعمل بنفس الطريقة على الأجهزة غير المتصلة. المشكلة هي أن الجهاز يصبح مرتبكًا لأنه غير متصل بالإنترنت ، ويرغب في اختبار ping a website/server/Host/ip
، لكنه لا يستطيع ذلك. لذلك أود أن أوصي مهلة. حظا سعيدا!
تم تضمين SLEEP 5
في بعض مجموعات موارد Windows.
تم تضمين TIMEOUT 5
في بعض مجموعات موارد Windows ، ولكنه أصبح الآن أمرًا قياسيًا في نظامي التشغيل Windows 7 و 8 (غير متأكد من نظام التشغيل Vista).
PING 1.1.1.1 -n 1 -w 5000 >NUL
بالنسبة لأي إصدار MS-DOS أو Windows مع عميل TCP/IP ، يمكن استخدام PING لتأخير التنفيذ لعدد من الثواني.
NETSH badcommand
(Windows XP/Server 2003 فقط) أو CHOICE
إجابتين:
أولاً ، للتأخير في ملف دفعي ، ببساطة دون كل الأساليب غير الواضحة التي يقترحها الناس:
timeout /t <TimeoutInSeconds> [/nobreak]
http://technet.Microsoft.com/en-us/library/cc754891.aspx
ثانياً ، تجدر الإشارة إلى أنه على الرغم من أنه قد لا يفعل ما تريده بالضبط ، باستخدام أداة القطع المدمجة في نظام Windows ، يمكنك تشغيله دون استخدام الماوس. شغّل أداة القطع ، وهروب من القصاصة الحالية ولكن اترك الأداة قيد التشغيل ، واضغط على Control + Print Screen عندما تريد أن يحدث القصاص. هذا لا ينبغي أن يتداخل مع كل ما تحاول القنص.
كنت أحاول القيام بذلك من داخل مهمة msbuild ، ولم يعمل الاختيار والوقت على حد سواء بسبب إعادة توجيه الإدخال/الإخراج.
انتهى بي الأمر باستخدام sleep.exe من http://sourceforge.net/projects/unxutils ، وهو أمر جميل لأنه لا يتطلب أي تثبيت وهو صغير جدًا.
محاولة مع choice
:
<Target Name="TestCmd">
<Exec Command="choice /C YN /D Y /t 5 " />
</Target>
النتائج في:
TestCmd:
choice /C YN /D Y /t 5
EXEC : error : The file is either empty or does not contain the valid choices. [test.proj]
[Y,N]?
C:\test.proj(5,9): error MSB3073: The command "choice /C YN /D Y /t 5 " exited with code 255.
محاولة مع timeout
:
<Target Name="TestCmd">
<Exec Command="timeout /t 5 " />
</Target>
النتائج في:
TestCmd:
timeout /t 5
EXEC : error : Input redirection is not supported, exiting the process immediately. [test.proj]
C:\test.proj(5,7): error MSB3073: The command "timeout /t 5 " exited with code 1.
وبصرف النظر:
أنا أستخدم فعلاً <Exec Command="sleep 2 & dbghost.exe" />
لأنني أقوم بتنفيذ dbghost.exe عدة مرات على التوازي ويقوم بإنشاء ملفات/قواعد بيانات temp استنادًا إلى وقت Epoch الحالي بالثواني - مما يعني بالطبع إذا بدأت مثيلات متعددة ، يستخدم كل منها نفس اسم temp. كنت أصلاً أحاول استخدام أمر MSBuild Extension Pack Thread.Sleep
، لكن يبدو أنه (عادةً) كان يعمل على تشغيل مهمة السكون جيدًا ، ولكن بعد ذلك بدأ تشغيل المهمة <exec>
في جميع مؤشرات الترابط في نفس الوقت ، وستفشل بالطبع dbghost.exe مع الصراعات. حتى الآن ، يبدو أن استخدام sleep.exe أكثر موثوقية.
هذا هو أحدث إصدار لما أستخدمه في الممارسة العملية لمدة عشر ثوانٍ مؤقتًا لرؤية الإخراج عند انتهاء البرنامج النصي.
BEST>@echo done
BEST>@set DelayInSeconds=10
BEST>@rem Use ping to wait
BEST>@ping 192.0.2.0 -n 1 -w %DelayInSeconds%000 > nul
يسمح لي الصدى الذي تم إجراؤه برؤية وقت انتهاء البرنامج النصي ويوفر ping التأخير. تعني علامات @ الإضافية أنني أرى النص "تم" وأن الانتظار يحدث بدون أن يصرفني أمرهم.
لقد جربت العديد من الحلول المقدمة هنا على جهاز XP ، لأن الفكرة كانت أن يكون لديك ملف دفعي يعمل على مجموعة متنوعة من الأجهزة ، ولذا اخترت الجهاز XP لأن البيئة من المحتمل أن تكون الأقل قدرة.
GOOD> ping 192.0.2.0 -n 1 -w 3000 > nul
يبدو أن هذا يعطي تأخيرًا لمدة ثلاثة ثوانٍ كما هو متوقع. محاولة واحدة بينغ دائم 3 ثوان.
BAD> ping -n 5 192.0.2.0 > nul
استغرق هذا حوالي 10 ثوان (وليس 5). توضيحي هو أن هناك 5 محاولات ping ، كل واحدة عن بعضها البعض ، مما يجعل 4 ثوان. ومن المحتمل أن تكون كل محاولة ping قد استغرقت حوالي ثانية تقريبًا ما مجموعه 9 ثوانٍ في المجموع.
BAD> timeout 5
BAD> sleep /w2000
BAD> waitfor /T 180
BAD> choice
الأوامر غير متوفرة.
BAD> ping 192.0.2.0 -n 1 -w 10000 > nul :: wait 10000 milliseconds, ie 10 secs
جربت أعلاه أيضًا ، بعد قراءة أنه يمكن إضافة التعليقات إلى ملفات BAT باستخدام نقطتين متتاليتين. ومع ذلك عاد البرنامج على الفور تقريبا. وضع التعليق على خطها الخاص قبل تنفيذ الأمر بشكل جيد.
GOOD> :: wait 10000 milliseconds, ie 10 secs
GOOD> ping 192.0.2.0 -n 1 -w 10000 > nul
لفهم ما يفعله ping بشكل عملي ، ركضت
ping 192.0.2.0 -n 5 -w 5000
استغرق هذا حوالي 30 ثانية ، على الرغم من 5 * 5 = 25. توضيحي هو أن هناك 5 محاولات ping تستغرق كل منها 5 ثوانٍ ، لكن هناك تأخيرًا واحدًا تقريبًا بين محاولات ping: هناك سبب وجيه لتوقع نتيجة مختلفة إذا قمت بالاتصال مرة أخرى على الفور ومن الأفضل إعطاء شبكة القليل من الوقت للتعافي من أي مشكلة كان لديه.
تحرير: سرقت من وظيفة أخرى ، .. RFC 3330 يقول عنوان IP 192.0.2.0 يجب ألا يظهر على شبكة الإنترنت ، لذلك فإن اختبار الاتصال بهذا العنوان يمنع هذه الاختبارات من البريد المزعج لأي شخص! لقد عدلت النص أعلاه وفقا لذلك!
انا فعلت هذا. إنها تعمل وتظهر الوقت المتبقي في ثوان. إذا كنت ترغب في استخدامه ، أضف إلى ملف دفعي:
call wait 10
كان يعمل عندما اختبرت ذلك.
سرد wait.bat
(يجب أن يكون في دليل العمل أو windir/system32/
):
@echo off
set SW=00
set SW2=00
set /a Sec=%1-1
set il=00
@echo Wait %1 second
for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, CC=1%%D-100, TBASE=((HH*60+MM)*60+SS)*100+CC, SW=CC
set /a TFIN=%TBASE%+%100
:ESPERAR
for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100,
CC=1%%D-100, TACTUAL=((HH*60+MM)*60+SS)*100+CC, SW2=CC
if %SW2% neq %SW% goto notype
if %il%==0 (echo Left %Sec% second & set /a Sec=sec-1 & set /a il=il+1)
goto no0
:notype
set /a il=0
:no0
if %TACTUAL% lss %TBASE% set /a TACTUAL=%TBASE%+%TACTUAL%
if %TACTUAL% lss %TFIN% goto ESPERAR
طريقتان أخريان يجب أن تعملا على كل شيء من XP وما فوق:
مع w32tm
w32tm /stripchart /computer:localhost /period:5 /dataonly /samples:2 1>nul
اشتراكاتك typeperf:
typeperf "\System\Processor Queue Length" -si 5 -sc 1 >nul
يمكنك استخدام VBScript ، على سبيل المثال ، ملف myscript.vbs
:
set wsobject = wscript.createobject("wscript.Shell")
do while 1=1
wsobject.run "SnippingTool.exe",0,TRUE
wscript.sleep 3000
loop
ملف دفعي:
cscript myscript.vbs %1
تحسين الكود الذي اقترحه المستخدم Aacini ، له دقة مئات من الثانية ولا يفشل عندما يصل الوقت إلى 23: 59: 59،99:
for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, CC=1%%D-100, TBASE=((HH*60+MM)*60+SS)*100+CC
:: Example delay 1 seg.
set /a TFIN=%TBASE%+100
:ESPERAR
for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, CC=1%%D-100, TACTUAL=((HH*60+MM)*60+SS)*100+CC
if %TACTUAL% lss %TBASE% set /a TACTUAL=%TBASE%+%TACTUAL%
if %TACTUAL% lss %TFIN% goto ESPERAR
يمكن القيام بذلك من خلال سطرين بسيطين في ملف دفعي: اكتب ملفًا مؤقتًا .vbs
في المجلد %temp%
واتصل به:
echo WScript.Sleep(5000) >"%temp%\sleep.vbs"
cscript "%temp%\sleep.vbs"
أسهل طريقة لفعل ذلك هي:
قم بتنزيل Sleep.exe على http://www.sleepcmd.com/ . يجب أن يكون ملف exe في نفس المجلد مثل البرنامج الذي كتبته!
أستخدم الطريقة التالية بالكامل بناءً على إمكانيات نظام التشغيل Windows XP لإجراء تأخير في ملف دفعي:
@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
يمكنك أيضًا إدراج اليوم في الحساب بحيث تعمل الطريقة أيضًا عند مرور فترة التأخير خلال منتصف الليل.
PING -n 60 127.0.0.1>nul
في حالة عدم توفر محول LAN الخاص بك.
إذا كان لديك إصدار مناسب من Windows و Windows Server 2003 Resource Kit Tools ، فهو يتضمن أمر السكون للبرامج الدفعية. المزيد على: http://malektips.com/xp_dos_0002.html
قم بإنشاء ملف cmd يسمى sleep.cmd:
REM Usage: SLEEP Time_in_MiliSECONDS
@ECHO off
ping 1.0.0.0 -n 1 -w %1 > nul
انسخ sleep.cmd إلى c:\windows\system32
الاستعمال:
sleep 500
ينام لمدة 0.5 ثانية. الحجج في مللي. بمجرد نسخها إلى System32 ، يمكن استخدامها في كل مكان.
تحرير: يجب أن تكون بعيدًا عن ذلك إذا لم يكن الجهاز متصلاً بشبكة (قل محمولًا تستخدمه في المترو) ، فإن خدعة ping لا تعمل حقًا بعد الآن.
في Windows XP SP3 ، يمكنك استخدام أمر السكون
ينتظر ping حوالي 5 ثوانٍ قبل انتهاء المهلة ، وليس ثانية واحدة كما ذكر أعلاه. هذا ما لم تقم أخبر أن تنتظر لمدة ثانية واحدة فقط قبل انتهاء المهلة.
ping 1.0.0.1 -n 1 -w 1000
سيتم اختبار ping مرة واحدة ، انتظر ثانية واحدة فقط (1000 مللي ثانية) للرد ، ثم انقضت المهلة.
لذلك تقريبًا 20 ثانية سيكون التأخير:
ping 1.0.0.1 -n 20 -w 1000
حسنا هذا يعمل إذا كان لديك خيار أو بينغ.
@echo off
echo.
if "%1"=="" goto askq
if "%1"=="/?" goto help
if /i "%1"=="/h" goto help
if %1 GTR 0 if %1 LEQ 9999 if /i "%2"=="/q" set ans1=%1& goto quiet
if %1 GTR 0 if %1 LEQ 9999 set ans1=%1& goto breakout
if %1 LEQ 0 echo %1 is not a valid number & goto help
if not "%1"=="" echo.&echo "%1" is a bad parameter & goto help
goto end
:help
echo SLEEP runs interactively (by itself) or with parameters (sleep # /q )
echo where # is in seconds, ranges from 1 - 9999
echo Use optional parameter /q to suppress standard output
echo or type /h or /? for this help file
echo.
goto end
:askq
set /p ans1=How many seconds to sleep? ^<1-9999^>
echo.
if "%ans1%"=="" goto askq
if %ans1% GTR 0 if %ans1% LEQ 9999 goto breakout
goto askq
:quiet
choice /n /t %ans1% /d n > nul
if errorlevel 1 ping 1.1.1.1 -n 1 -w %ans1%000 > nul
goto end
:breakout
choice /n /t %ans1% /d n > nul
if errorlevel 1 ping 1.1.1.1 -n 1 -w %ans1%000 > nul
echo Slept %ans1% second^(s^)
echo.
:end
مجرد تسميته sleep.cmd أو sleep.bat وتشغيله
كتبت برنامج powerbasic wait.exe ، حيث يمكنك تمرير معلمة ميلي ثانية إليه في ملف الدُفعات الخاص بك
wait 3000
system('c:/windows/system32/SnippingTool.exe')
رمز EXE:
FUNCTION PBMAIN()
c$ = Command$
s! = Val(c$)*1000
Sleep s!
END FUNCTION