2017-08-14 67 views
1

Windows 7及更高版本包含一個名爲「waitfor.exe」的實用程序。該程序應該監聽並等待接收到一個指定的信號。它也可以發送信號。如何使用Windows waitfor實用程序

等待信號的語法是這樣的:waitfor.exe somevent

發送的語法應該是:waitfor.exe /S remotecomputer /SI somevent。還可以選擇指定用戶和密碼以連接到遠程計算機。

但是我無法正常工作。該程序在等待信號時似乎可以正常工作。但是我從來沒有能夠讓程序在發送模式下工作。

我已經試過這些可能性:

  • waitfor /si someevent - 產生錯誤 - 錯誤:無法發送信號 'someevent'。
  • waitfor /s someevent - 語法錯誤
  • waitfor /s %COMPUTERNAME% someevent - 語法錯誤
  • waitfor /s %COMPUTERNAME% /si someevent - 產生誤差 - ERROR:無法發送信號 'someevent'。

我想用這個程序來簡單地在兩個命令窗口之間同步,作爲同一個用戶運行。兩者都沒有升高。在這種情況下測試會產生上述錯誤。

我知道我可以找到(或寫)第三方實用程序來做到這一點,但我想使用Windows內置實用程序。我也想避免使用PowerShell,因爲它的性能很差,對於我的用例。同樣也,我知道我可以在接收端使用「if exists」來拼湊同步機制,並在發送端創建一個文件(使用reg.exe的註冊表,同上),但是我想避免那也。這些解決方案的延遲與性能成反比(接收方需要使用輪詢循環)。

有沒有人知道如何使這個簡單的相同電腦同用戶場景waitfor.exe工作?還是其他任何內置的具有良好性能和零延遲的內置?錯誤消息


確切細節:

C:\>where waitfor 
C:\Windows\System32\waitfor.exe 

C:\>rem - did run "waitfor myevent" in another window 

C:\>waitfor /s %COMPUTERNAME% /si myevent 
ERROR: Unable to send signal 'myevent'. 

C:\>waitfor /s %COMPUTERNAME% myevent 
ERROR: Invalid syntax. 
Type "WAITFOR /?" for usage. 

C:\> 

我的電腦運行的是Windows 2008 R2服務器,是一個企業的活動目錄域的一部分。


+0

如果您使用用戶名和密碼會發生什麼? 'WAITFOR/S%PCNAME%/ U%UNAME%/ P%UPASS%/ SI%SIGNAL%'另外,我建議你提供更多關於你試圖發送的信號和每個信號之間的同步信息。 – Compo

+0

我剛剛注意到你正在努力實現的目標,我甚至不確定'WaitFor'允許通過網絡發送給自己。你有沒有成功過一個非常基本的信號,以確保它甚至可以工作? – Compo

+0

waitfor.exe基於[mailslots](https://msdn.microsoft.com/zh-cn/library/aa365576)。 'waitfor someevent'創建一個名爲'\\。\ mailslot \ WAITFOR.EXE \ someevent'的郵筒。通過'waitfor/si someevent'發送信號打開'\\ * \ mailslot \ WAITFOR.EXE \ someevent'的句柄,其中「*」表示UNC提供程序向域中的每臺計算機廣播消息。 'waitfor/s%COMPUTERNAME%/ si someevent'專門打開'\\ [computer_name] \ mailslot \ WAITFOR.EXE \ someevent'而不是廣播信號。 – eryksun

回答

0

看來你的系統上有些東西不對。這適用於我,使用正常的命令提示符窗口(不與管理權限一起運行)。

我在筆記本電腦上打開了幾個命令窗口。首先,我輸入「wait for somevent」。它開始等待。在第二行中,我輸入了「waitfor/si somevent」,它給出了「成功:發送信號」消息,並且第一個命令窗口中的waitfor命令終止。

我嘗試了第二次,在第一個窗口中做同樣的事情(waitfor somevent)。在第二個窗口中,我輸入「waitfor/sots-jburd-ltOTS-JBURD-LT/si somevent」(其中ots-jburd-lt是我的筆記本電腦的名稱),並且第一個窗口中的waitfor再次按預期終止。

我登錄到家庭網絡並在那裏運行了一些快速測試,並且所有事情都按預期工作(從一臺計算機發送'somevent'到另一臺計算機)。

我的測試表明你的語法是正確的。您報告一個簡單的「waitfor/si someevent」失敗,並顯示「錯誤:無法發送信號'someevent'」消息。這不會發生在我的機器上。 (和發佈的問題是關於如何使用waitfor命令。)

我不確定什麼可以防止信號發送。最有可能的防火牆設置?但是我的筆記本電腦現在正在公共網絡上運行,所有防禦措施都達到了100%,並且在我的筆記本電腦上運行並沒有任何問題。也許您還有其他第三方反惡意軟件正在運行,這會阻止信號被髮送?

0

這是實現您的示例代碼簡單:

@echo off 
setlocal 
if "%1" neq "" goto %1 


rem Start a Send - Receive pair 
start "" /B "%~F0" Send ^> pipefile.txt 
call "%~F0" Receive < pipefile.txt 
echo Program ending. 
goto :EOF 


:Send 
set "line=" 
set /P "line=Enter a line, EXIT to end: " > CON 
echo %line% 
waitfor /SI dataAvailable > NUL 
if /I "%line%" neq "EXIT" goto Send 
echo Send part ending... > CON 
exit /B 


:Receive 
waitfor dataAvailable > NUL 
set /P "data=" 
echo Data received: "%data%" 
if /I "%data%" neq "EXIT" goto Receive 
echo Receive part ending... 
exit /B 

這是輸出:

C:\Users\Antonio\Documents\test> test.bat 
Enter a line, EXIT to end: Line one 
Data received: "Line one" 
Enter a line, EXIT to end: Second line sent to receive part 
Data received: "Second line sent to receive part" 
Enter a line, EXIT to end: exit 
Data received: "exit" 
Receive part ending... 
Program ending. 

C:\Users\Antonio\Documents\test> Send part ending... 

的Windows 8.1在這裏。

相關問題