2017-02-08 22 views
1

Я пытаюсь вытащить вывод ipconfig /all и поместить его в текстовый файл. Я создал небольшой VBScript, который запускает ipconfig без проблем. Затем я называю это в другом VBScript. Все это выполняется, но выходной текстовый файл остается пустым, а первичный VBScript, похоже, ничего не пишет после запуска ipconfig.vbs.Использование cscript для вывода «ipconfig/all», но текстовый файл пуст

Вот пример из основного сценария .vbs:

' Pulling network config 
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 
Set objFile = objFSO.CreateTextFile("C:\Users\dsadmin\Desktop\LogNet\network_config.txt", 8) 
set objFile = objFSO.OpenTextFile("C:\Users\dsadmin\Desktop\LogNet\network_config.txt") 
objShell.Run("cscript //nologo C:\Users\dsadmin\Downloads\ipconfig.vbs >C:\Users\dsadmin\Desktop\LogNet\network_config.txt") 

Вот сценарий он называет (ipconfig.vbs):

Set objShell = CreateObject("WScript.Shell") 
objShell.Run("ipconfig /all") 

Я из идей, когда речь идет о перетасовывать вещи вокруг.

+0

Возможный дубликат [Перенаправить вывод, обработанный через vbscript (cscript) в файл] (http://stackoverflow.com/questions/16572252/redirect-output-processed-via-vbscript-cscript-to-file) – Lankymart

+0

Вы ничего не пропускаете вернитесь к стандартным потокам вывода, используйте '.Exec()' для доступа к потоку '.StdOut'. – Lankymart

+0

@Lankymart. Вы имеете в виду использование «objShell.Exec» вместо «objShell.Run»? Когда я это делаю, он все равно не выводит. – wyatt8919

ответ

1

У вас есть две проблемы с этим подходом

  1. @Ansgar-Wiechers Как points out> Перенаправление является частью УМК.

  2. Как только перенаправление работает, вы должны получить стандартный вывод из выполненной команды и перенаправить его на вывод cscript.exe. К сожалению, .Run() не предоставляет доступ к стандартным выходным потокам, вместо этого вы должны использовать .Exec().

Ниже приведен пример (предполагается, что все файлы в одном направлении, но может быть изменен);

' Pulling network config 
Set objShell = CreateObject("WScript.Shell") 
Call objShell.Run("%COMSPEC% /c cscript //nologo ipconfig.vbs > network_config.txt") 

в ipconfig.vbs

Set objShell = CreateObject("WScript.Shell") 
Set exec = objShell.Exec("ipconfig /all") 
'Redirect output from executed command to the script output. 
Call WScript.StdOut.Write(exec.StdOut.ReadAll) 

Выход в network_config.txt

Windows IP Configuration 

    Host Name . . . . . . . . . . . . : 
    Primary Dns Suffix . . . . . . . : 
    Node Type . . . . . . . . . . . . : 
    IP Routing Enabled. . . . . . . . : No 
    WINS Proxy Enabled. . . . . . . . : No 
    DNS Suffix Search List. . . . . . : 

Wireless LAN adapter Local Area Connection* 2: 

    Media State . . . . . . . . . . . : Media disconnected 
    Connection-specific DNS Suffix . : 
    Description . . . . . . . . . . . : Microsoft Wi-Fi Direct Virtual Adapter 
    Physical Address. . . . . . . . . : 
    DHCP Enabled. . . . . . . . . . . : Yes 
    Autoconfiguration Enabled . . . . : Yes 
... 

... Усеченный для удобства чтения и конфиденциальные данные удалены

+0

Это работает! Отлично. Спасибо огромное! Теперь, если вы не пропустите передачу знаний новичку, у меня есть пара вопросов, которые, надеюсь, помогут мне избежать этой проблемы в будущем. Мне непонятно, что делает строка «% COMSPEC%». Есть ли простое объяснение? Во-вторых - что касается «ipconfig.vbs» - как «set exec» разрешает вывод в отличие от «obj.ShellRun»? – wyatt8919

+0

@ wyatt8919, чтобы быть абсолютно честным, это большая работа для не очень большой выгоды, предложение Ansgars запустить его напрямую должно работать с меньшей сложностью. ** Редактирование: ** Хотя я только что протестировал его, и он терпит неудачу для меня, расследует ... считается честным, что должно работать. – Lankymart

+0

Я попытался, но сделать это по-своему дает мне ошибку «handle is invalid». – wyatt8919

1

Перенаправление (>) - встроенная функция CMD. Вы должны выполнить инструкцию в CMD, чтобы иметь возможность использовать его:

objShell.Run "%COMSPEC% /c cscript //NoLogo C:\ipconfig.vbs >C:\network_config.txt" 

Конечно, вы должны убедиться, что второй сценарий записывает в STDOUT, в первую очередь, так как @Lankymart указал.

Если весь ваш второй скрипт работает ipconfig /all, то в этом случае нет большого количества оберток в отдельном скрипте. Просто запустите его напрямую:

objShell.Run "%COMSPEC% /c ipconfig /all >C:\network_config.txt" 
+0

Хорошо, я заменил 'objShell.run ("Cscript // NOLOGO C: \ Users \ DSAdmin \ Downloads \ ipconfig.vbs> C: \ Users \ DSAdmin \ Desktop \ LogNet \ network_config.txt")' с 'objShell.run (" cscript // nologo C: \ Users \ dsadmin \ Downloads \ ipconfig.vbs> C: \ Users \ dsadmin \ Desktop \ LogNet \ network_config.txt ")' и теперь я получаю " ошибка недопустимого символа. Мне где-то нужны скобки? – wyatt8919

+0

Первый пример не будет работать без перенаправления стандартного потока вывода в 'ipconfig.vbs'. – Lankymart

+0

@ wyatt8919 Вы заменили заявление на то же самое утверждение, и теперь вы получаете сообщение об ошибке? Я как-то сомневаюсь в этом. –