如何使用windows waitfor实用程序

时间:2017-08-14 13:21:05

标签: windows batch-file cmd

Windows 7及更高版本包含一个名为" waitfor.exe"的实用程序。该程序应该监听并等待接收命名信号。它也可以发送信号。

等待信号的语法类似于: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 - 产生错误 - 错误:无法发送信号' someevent'。

我想使用这个程序简单地在两个命令窗口之间进行同步,以同一个用户身份运行。两者都没有升高。在这种情况下进行测试会产生上述错误。

我知道我可以找到(或写入)第三方实用程序来执行此操作,但我想使用Windows内置实用程序。对于我的用例,我也想避免使用PowerShell,因为它的性能很差。还有,我知道我可以使用"如果存在"那么可以拼凑一个同步机制。在接收端,再加上在发送端创建一个文件(同上注册表,使用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服务器,并且是公司活动目录域的一部分。

2 个答案:

答案 0 :(得分:0)

您的系统似乎有些不对劲。这对我来说很好,使用正常的命令提示符窗口(不使用管理权限运行)。

我在笔记本电脑上打开了几个命令窗口。在第一个中,我输入了“waitfor somevent”。它开始等待。在第二个中,我输入了“waitfor / si somevent”,它给出了一条消息“SUCCESS:Signal sent”,然后终止了第一个命令窗口中的waitfor命令。

我第二次尝试,在第一个窗口做同样的事情(waitfor somevent)。在第二个窗口中,我键入了“waitfor / s ots-jburd-ltOTS-JBURD-LT / si somevent”(其中ots-jburd-lt是我的笔记本电脑的名称),同样,第一个窗口中的waitfor按预期终止

我登录了我的家庭网络并在那里进行了一些快速测试,一切都按预期工作(从一台计算机向另一台计算机发送'somevent')。

我的测试表明您的语法是正确的。您报告一个简单的“waitfor / si someevent”失败,并显示消息“ERROR:无法发送信号'someevent'”。这不会发生在我的机器上。 (已发布的问题是如何使用waitfor命令。)

我不确定什么可以防止发送信号。最有可能是防火墙设置?但是我的笔记本电脑现在正在公共网络上运行,我所有的防御都是100%,它可以在我的笔记本电脑上运行,没有任何问题。也许您还有其他第三方反恶意软件正在运行,以防止发送信号?

答案 1 :(得分: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。