2011-07-23 100 views
2

上下文
我想寫一個腳本,根據條件切換我的WLAN適配器(啓用/禁用它)。如果當前啓用了該腳本,則該腳本應禁用該適配器,或者相反,如果當前禁用該腳本,則該腳本將啓用它這是我想出迄今:「findstr」在VBScript中總是返回失敗

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包含「已禁用」。如果「已禁用」未找到,findstr應返回errorlevel> 0,否則errorlevel == 0(零)。該腳本的其餘部分只是基於返回(它應該保存errorlevel的值)的值。

問題
返回的值始終爲1是否C:\ devstat.txt含 「禁用」 與否。

我在這裏錯過了什麼?


最後編輯
由於barlop的提示,我設法找出一個解決辦法。事實證明,罪魁禍首是Windows腳本主機。該腳本具有執行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 
+0

也許[直接閱讀文本文件](http://technet.microsoft.com/en-us/library/ee198716.aspx)而不是調用'findstr'?不回答這個問題,但通常是這樣做的「更好的方式」。 – grawity

+0

@grawity:我不知道如何使用FileSystemObject在文本文件中查找字符串。文檔似乎沒有給出有關這方面的例子。並感謝編輯我的問題;標題現在更好地反映了這個問題。 – 2011-07-23 15:35:36

回答

1

沒有與FINDSTR沒有問題..

運行這段代碼,這與您的代碼相同,但wscript.echo僅在findstr行之前爲「WAIT」。現在,當wscript.echo「WAIT」行被執行時,打開文件,您可能會看到它不包含禁用,現在禁止寫入,並保存它。然後單擊確定以顯示等待的消息。程序繼續。

我從findstr命令返回的錯誤級別中得到正確的結果。也就是說
1時,它不包含當它

您也可以嘗試排除故障的緣故,使程序更加簡單,找到錯誤禁用
0。所以你可以嘗試刪除該行,以測試findstr,然後你可能已經發現findstr很好。在findstr之前查看文件並手動修改它,也可以顯示它,而不必刪除該行。

我也嘗試改變返回到返回'因爲我想也許返回是一個關鍵字,因此不會工作,但它適用於你使用的返回變量名。

所以這個問題是

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

但FINDSTR是罰款。我認爲你是對的

WshShell.Run使用真正的第三個參數( 「FINDSTR命苦C:\ getmail \ AA」,0,真)

因爲從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 
+0

如果你得到和我一樣的結果,那麼你的問題不是用vbscript或findstr,你的問題是用devcon。這對於超級用戶來說可能是一個新問題,然後你應該把所有的編程代碼都放在它之外,因爲它與問題無關。 – barlop

+0

感謝您的提示。我找到了一個解決方法;看我的編輯。 – 2011-07-23 17:51:16

相關問題