Windowsのスニッピングツールで画面をキャプチャできますが、ウェブカメラで表示されている画像を撮影するなど、5秒後に画面をキャプチャしたいことがあります。 (たとえば、スクリプトを実行してカメラに向かって笑ってください。)
バッチファイルで5秒間スリープするにはどうすればよいですか?
1つのハックは、pingコマンドを(誤って)使用することです。
ping 127.0.0.1 -n 6 > nul
説明:
私は誰も言わなかったことにとても驚いています。
C:\> timeout 5
N.B。timeout 5
は次のことを意味します(Danに感謝します)。
4秒から5秒の間に眠る
これは、次のものをバッチファイルに入れて繰り返し実行し、1番目と2番目のecho
の間の時間差を計算することによって経験的に検証できます。
@echo off
echo %time%
timeout 5 > NUL
echo %time%
選択 コマンドを試してください。それはMSDOS 6.0から出回っていて、そしてトリックをするべきです。
/ Tパラメータを使用してタイムアウトを秒単位で指定し、/ Dパラメータを使用してデフォルトの選択を指定し、選択した選択を無視します。
問題になる可能性があることの1つは、タイムアウト期間が経過する前にユーザーが選択文字の1つを入力した場合です。部分的な回避策は状況を難読化することです - 有効な選択肢のリストを隠し、選択肢のセットに1文字しかないようにするには/ 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はpingの間1秒待つので、必要以上に1つ指定する必要があります。
システムに PowerShell がある場合は、次のコマンドを実行するだけです。
powershell -command "Start-Sleep -s 5"
編集:人々はPowerShellが起動するのにかかる時間があなたが待とうとしている時間と比較して重要であるという問題を提起しました。待機時間の精度が重要な場合(つまり、1秒または2秒の余分な遅延が許容できない場合)は、次の方法を使用できます。
powershell -command "$sleepUntil = [DateTime]::Parse('%date% %time%').AddSeconds(5); $sleepDuration = $sleepUntil.Subtract((get-date)).TotalMilliseconds; start-sleep -m $sleepDuration"
これにはwindowsコマンドが発行された時間がかかり、powershellスクリプトはその時間の5秒後までスリープします。だから、PowerShellがあなたの睡眠時間よりも起動するのにかかる時間が少ない限り、このアプローチはうまくいくでしょう(私のマシンでは約600msです)。
timeout
でそれを作ることができます:
これが表示されます:timeout 5
これは表示されませんtimeout 5 >nul
waitfor /T 180
できませんか?
waitfor /T 180 pause
は、「エラー: 'pause'の待機中にタイムアウトしました」という結果になります。
waitfor /T 180 pause >nul
は敷物の下でその「エラー」を一掃します
waitfor
コマンドは、Windows 95以降のWindows OSにあるはずです。
過去に私はsleep
という名前の実行ファイルをダウンロードしました。これはあなたがパスに入れた後にコマンドラインで動作します。
例えば、sleep shutdown -r -f /m \\yourmachine
ですが、shutdownには-tオプションが組み込まれています
Timeout /t 1 >nul
1秒で一時停止するようなものですが、ほぼ100.000(99.999)秒までの間に水を入れることができます。インターネットに接続している場合、最善の解決策は次のとおりです。
ping 1.1.1.1. -n 1 -w 1000 >nul
Pingを実行するとミリ秒単位でカウントされるため、1秒は1000ミリ秒になります。しかし、pingコマンドは少し不確かです。オフラインマシンでは同じようには機能しません。問題は、オフラインであるためにマシンが混乱し、website/server/Host/ip
をpingしたいのですが、できないことです。だから私はタイムアウトをお勧めします。がんばろう!
SLEEP 5
は一部のWindowsリソースキットに含まれていました。
TIMEOUT 5
は一部のWindowsリソースキットに含まれていましたが、現在はWindows 7および8の標準コマンドです(Vistaについてはよくわかりません)。
PING 1.1.1.1 -n 1 -w 5000 >NUL
TCP/IPクライアントを使用するMS-DOSまたはWindowsのバージョンでは、PINGを使用して実行を数秒間遅らせることができます。
NETSH badcommand
(Windows XP/Server 2003のみ)またはCHOICE
二つの答え:
まず、バッチファイルを遅らせるために、人々が提案しているすべての鈍い方法を使わずに単純にします。
timeout /t <TimeoutInSeconds> [/nobreak]
http://technet.Microsoft.com/ja-jp/library/cc754891.aspx
第二に、それはあなたが望んでいることを正確にはしないかもしれませんが、作り付けのWindowsのスニップツールを使用して、あなたがマウスを使用せずにそれにスニップを引き起こすことができることを言及する価値があります。スニップツールを実行し、現在のスニップから脱出しますが、ツールは実行したままにして、スニップを実行したいときにCtrl + Print Screenを押します。これはあなたが切り取ろうとしているものが何であれ妨害するべきではありません。
私はmsbuildタスク内からこれを実行しようとしていました、そして選択とタイムアウトは両方ともI/Oリダイレクトのためにうまくいきませんでした。
私は http://sourceforge.net/projects/unxutils からsleep.exeを使用することになりました。それは小さいです。
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.
余談:
Dbghost.exeを複数回並行して実行し、現在のEpoch時間に基づいて一時ファイル/データベースを作成するため、実際には<Exec Command="sleep 2 & dbghost.exe" />
を使用しています。もちろん、複数のインスタンスを起動すると、それぞれ同じ一時名が使用されます。私はもともとMSBuild Extension PackのThread.Sleep
コマンドを使おうとしていましたが、(通常は)sleepタスクを正常に実行していましたが、その後すべてのスレッドで<exec>
タスクを同時に開始すると、もちろんdbghost.exeは失敗します。衝突します。これまでのところ、sleep.exeを使用する方が信頼性が高いようです。
これは、スクリプトが終了したときに出力を表示するために10秒間休止するために実際に使用しているものの最新バージョンです。
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が遅延を提供するかを確認できます。余分な@記号は、 "done"というテキストが表示されていることを意味しています。待機しているのは、それらのコマンドに気を取られることなくです。
このアイデアはXPマシン上でさまざまな解決策を試してみました。アイデアはさまざまなマシン上で実行されるバッチファイルを用意することなので、XPマシンを選びました。環境としては能力が最も低いと思われます。
GOOD> ping 192.0.2.0 -n 1 -w 3000 > nul
これは予想どおり3秒の遅れを与えるようでした。指定された3秒間続く1回のping試行。
BAD> ping -n 5 192.0.2.0 > nul
これは約10秒かかりました(5ではありません)。私の説明では、pingの試行回数は5回で、それぞれ1秒間隔で4秒になります。そして、各pingの試行はおそらく1秒程度続き、推定で合計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
2つの連続したコロンを使用してBATファイルにコメントを追加できることを読んだ後、私も上記を試しました。しかし、ソフトウェアはすぐに戻ってきました。 pingを実行する前にコメントを一行に入れてください。
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
5 * 5 = 25であっても、これは約30秒かかりました。私の説明は、それぞれ5秒間続く5回のping試行があるが、ping試行間には約1秒の時間遅れがあるということです。すぐにもう一度pingを実行した場合、別の結果が予想されるのにはほとんど理由があります。それが持っていたどんな問題からでも回復するために少しの時間ネットワーク。
編集: 別の投稿 から盗まれた、.. RFC 3330 はIPを言うアドレス192.0.2.0はインターネット上には表示されないはずなので、このアドレスにpingを送信すると、これらのテストで誰かがスパムすることを防げます。それに応じて上記のテキストを修正しました。
私はこれを作りました。それは働いていて、残り時間を秒単位で示しています。使いたい場合は、バッチファイルに追加してください。
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以上のすべてに有効な方法が2つあります。
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によって提案されたコードの改良、それは100分の1秒の分解能を持ち、時間が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
これは、バッチファイル内に2行の簡単な行で実行できます。一時的な.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
計算に日を挿入して、遅延間隔が深夜0時を過ぎたときにもこの方法が機能するようにすることもできます。
PING -n 60 127.0.0.1>nul
lANアダプタが利用できない場合.
適切なバージョンのWindowsと Windows Server 2003リソースキットツール がある場合は、バッチプログラム用のsleepコマンドが含まれます。さらに詳しく: http://malektips.com/xp_dos_0002.html
Sleep.cmdという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 SP2では、sleepコマンドを使用できます。
pingはタイムアウトするまでに約5秒待機します。前述のように1秒ではありません。それは、あなたが に指示しない限り タイムアウトする前に1秒間待つだけだということです。
ping 1.0.0.1 -n 1 -w 1000
一度pingを実行し、応答を待つ時間は1秒(1000ミリ秒)です。その後タイムアウトします。
したがって、 約 20秒の遅延は次のようになります。
ping 1.0.0.1 -n 20 -w 1000
あなたが選択またはpingを持っているならまあこれはうまくいきます。
@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