“findstr”总是在VBScript中返回失败

时间:2011-07-23 15:09:16

标签: windows vbscript

上下文
我正在尝试自己编写一个脚本,根据条件切换我的WLAN适配器(启用/禁用它)。如果适配器当前已启用,则该脚本应禁用该适配器;如果当前已禁用,则应禁用该适配器。这是我到目前为止所提出的:

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "%comspec% /C devcon status PCI\VEN_168C > C:\devstat.txt", 0, false
Return = WshShell.Run("findstr disabled C:\devstat.txt", 0, true)
WScript.Echo Return

If Return = 0 Then
        WshShell.Run "devcon " & "enable PCI\VEN_168C", 0, false
Else
        WshShell.Run "devcon " & "disable PCI\VEN_168C", 0, false
End If


脚本说明
第1行非常明显,所以我正在跳过那一部分。 第2行执行 devcon 以检查我的WLAN适配器的状态(硬件ID PCI \ VEN_168C )并将输出转储到 C: \ devstat.txt 第3行运行 findstr 以检查 C:\ devstat.txt 是否包含“ disabled ”。如果未找到“已禁用”,则 findstr 应返回errorlevel> 0,否则errorlevel == 0(零)。脚本的其余部分只是基于 返回 (它应该包含errorlevel的值)的值的语句。

问题
无论 C:\ devstat.txt 是否包含“已禁用”, 返回 的值始终为1。

我在这里缺少什么?


最终修改
感谢barlop的提示,我设法找到了解决方法。事实证明,罪魁祸首是Windows Scripting Host。执行第2行后,脚本必须暂停几个小时,所以这是最终脚本的样子:

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "%comspec% /C devcon status PCI\VEN_168C > C:\devstat.txt", 0, false
WScript.sleep 400
Return = WshShell.Run("findstr disabled C:\devstat.txt", 0, true)
Rem WScript.Echo Return

If Return = 0 Then
    WshShell.Run "devcon " & "enable PCI\VEN_168C", 0, false
Else
    WshShell.Run "devcon " & "disable PCI\VEN_168C", 0, false
End If

1 个答案:

答案 0 :(得分:1)

findstr ..没有问题。

运行此代码,该代码与您的代码相同,但在findstr行之前使用wscript.echo“WAIT”。现在,当执行wscript.echo“WAIT”行时,打开文件,您可能会看到它不包含禁用,现在写入禁用,并保存。然后单击“确定”以显示等待的消息。该计划仍在继续。

我从findstr命令返回的errorlevel中得到了正确的结果。那是
1当它不包含禁用时 它的时间为0

您也可以尝试进行故障排除,使程序更容易找到错误。所以你可以尝试删除该行,测试findstr,然后你可能发现findstr很好。在findstr之前查看文件,并手动修改它,也可以显示它而不必删除该行。

我也试过改变Return to Retur'我想也许Return是一个关键字,因此不会很好用,但它适用于您使用的Return变量名。

所以问题是

WshShell.Run "%comspec% /C devcon status PCI\VEN_168C > C:\devstat.txt", 0, false

但是findstr很好。而且我认为你在

中使用True作为第三个参数是正确的

WshShell.Run(“findstr xbc C:\ getmail \ a.a”,0,true)

因为从script56.chm文档“如果设置为true,脚本执行暂停直到程序完成,并且Run返回程序返回的任何错误代码。如果设置为false(默认值),则Run方法立即返回启动程序,自动返回0(不被解释为错误代码)。“

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "%comspec% /C devcon status PCI\VEN_168C > C:\devstat.txt", 

0, false
wscript.echo "WAIT"
Return = WshShell.Run("findstr disabled C:\devstat.txt", 0, true)
WScript.Echo Return

If Return = 0 Then
        WshShell.Run "devcon " & "enable PCI\VEN_168C", 0, false
Else
        WshShell.Run "devcon " & "disable PCI\VEN_168C", 0, false
End If