«findstr» всегда возвращает ошибку в VBScript - PullRequest
2 голосов
/ 23 июля 2011

Context
Я пытаюсь написать скрипт, который будет переключать мой адаптер 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 (идентификатор оборудования PCI \ VEN_168C ) и вывести вывод в C: \ devstat. TXT . Строка 3 запускает findstr , чтобы проверить, содержит ли C: \ devstat.txt « disabled ». Если « отключено » не найдено, findstr должно вернуть errorlevel> 0, в противном случае errorlevel == 0 (ноль). Остальная часть сценария - это просто операторы, основанные на значении Return (который должен содержать значение errorlevel).

Задача
Значение Return всегда равно 1 независимо от того, C: \ devstat.txt содержит " отключено " или нет.

Что мне здесь не хватает?


Окончательное редактирование
Благодаря подсказке Барлопа мне удалось найти обходной путь. Оказывается, виновником является 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 Ответ

1 голос
/ 23 июля 2011

Нет проблем с findstr ..

Запустите этот код, который совпадает с вашим, но с wscript.echo "WAIT" непосредственно перед строкой findstr.Теперь, когда эта wscript.echo строка «WAIT» выполнена, откройте файл, вы, вероятно, увидите, что он не содержит отключенных файлов, теперь запись отключена и сохраните его.Затем нажмите кнопку ОК, чтобы получить сообщение «Подождите»И программа продолжается.

Я получаю правильный результат по уровню ошибки, возвращенному командой findstr.То есть
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 \ aa", 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...