1

Тема: VBScript/cmd: коды выхода/возврата через .Run

Поднимаю такой сабж. Многие наверняка пользуются.

К примеру, через exit можно вернуть значение переменной среды:

MsgBox CreateObject("wscript.shell").Run("cmd /v:on /c set /A i=6 & exit !i!", 0, True)

Интересует способ вернуть полученное в консоли значение.
Возьмём такую команду: cmd /c dir "%ProgramFiles% | find /c "Windows"
Как получить выходное число из .Run?

2

Re: VBScript/cmd: коды выхода/возврата через .Run

А в чём сложность?

Option Explicit

Dim objWshShell
Dim lngErrorLevel

Set objWshShell = WScript.CreateObject("WScript.Shell")

lngErrorLevel = objWshShell.Run("""%comspec%"" /c dir ""%ProgramFiles%"" | find.exe /c ""Windows""", 1, True)

WScript.Echo lngErrorLevel

Set objWshShell = Nothing

WScript.Quit 0

3

Re: VBScript/cmd: коды выхода/возврата через .Run

Нет. Это не сработает. Тут нужно либо через for, где данная строка будет множеством, либо ещё как-то по-хитрому.

4

Re: VBScript/cmd: коды выхода/возврата через .Run

MsgBox CreateObject("wscript.shell").Run("cmd /c ""for /f %i in ('dir /ad/b ""%ProgramFiles%""^| find /c ""Windows""') do exit /b %i""", 0, True)

5 (изменено: Flasher, 2014-12-08 16:29:29)

Re: VBScript/cmd: коды выхода/возврата через .Run

Yury
Благодарствую. Знание некоторых деталей подвело при формировании похожей строки.
А то очень не хотелось останавливаться на этом:

With CreateObject("WScript.Shell")
  If InStrRev(WScript.FullName, "WScript.exe") Then .Run "CScript.exe """ & WScript.ScriptFullName, 0 Else _
  MsgBox .Exec("%comspec% /c dir ""%ProgramFiles%"" | find /c ""Windows""").StdOut.ReadLine
End With

6

Re: VBScript/cmd: коды выхода/возврата через .Run

Нет. Это не сработает.

Недоглядел «/c» — что Вас интересует число строк. Тогда, да — разбор по «for /f» и вывод. Но с .Exec Вам всё равно придётся работать, если получить надо именно строку.

7 (изменено: Flasher, 2014-12-08 17:03:24)

Re: VBScript/cmd: коды выхода/возврата через .Run

Со строками-то проблем нет, нужно только число. Сейчас ещё испытаю на многоразовых find. Если что, вернусь. )

Add: всё, разобрался с множествами.

8

Re: VBScript/cmd: коды выхода/возврата через .Run

Поспешил с выводами.
В чём моя ошибка?

Pr = "%ProgramFiles%\7-Zip\7z.exe"
Arch = WScript.Arguments(0)

MsgBox CreateObject("WScript.Shell").Run("cmd /c ""for /f %# in (`""" & Pr & """ l """ &_
Arch & """ -slt^| find ""Path = ""^| find /C /V ""\""`) do exit /b %#""", 0, true)

Пытаюсь получить число корневых элементов.

9

Re: VBScript/cmd: коды выхода/возврата через .Run

Flasher пишет:

Пытаюсь получить число корневых элементов.

Уникальных или вообще?

10 (изменено: Flasher, 2014-12-08 19:07:46)

Re: VBScript/cmd: коды выхода/возврата через .Run

А как они могут быть неуникальными?

11

Re: VBScript/cmd: коды выхода/возврата через .Run

Если вообще, то на командном языке будет нечто вроде:

for /f %i in ('7z l archive ^| findstr /irc:".\\." ^| find /c /v ""') do @set /a %i - 2

Минус два - это эдакий сапресс строк "Listing archive: ..." и "Path = ...", - можно попробовать и через skip, но это первое пришедшее на ум.

12

Re: VBScript/cmd: коды выхода/возврата через .Run

Уникальное имя в том смысле, что не дублируется.

13

Re: VBScript/cmd: коды выхода/возврата через .Run

Pr = "%ProgramFiles%\7-Zip\7z.exe"
Arch = WScript.Arguments(0)

MsgBox CreateObject("WScript.Shell").Run("cmd /c for /f %# in ('""""" & Pr & """ l -slt """ &_
Arch & """| find ""Path = ""| find /c /v ""\""""') do exit /b %#", 0, True)

14

Re: VBScript/cmd: коды выхода/возврата через .Run

greg zakharov
Одноимёнными в одной ветви архива могут быть папка и файл. Но мне такие (не считая экспериментальных) ещё не попадались. Пример ясен, но он всё же про другое.

Yury как всегда молчком, ещё раз благодарю.
Т.е. нужно множество брать ещё и в сдвоенные кавычки. И без ^ обошлось. Хм. А разжевать? )

15

Re: VBScript/cmd: коды выхода/возврата через .Run

Если интересно, есть вариант и попроще, но он не годится для некоторых методик сжатия архивов.

'...
MsgBox CreateObject("WScript.Shell").Run("cmd /c for /f %# in ('""""" & Pr & """ l -x!*\* """ &_
Arch & """| find /c ""....""""') do exit /b %#", 0, True)

greg zakharov, это для универсального случая, как работать с зипами известно.

16

Re: VBScript/cmd: коды выхода/возврата через .Run

greg zakharov пишет:

Пардон, а на что в выдаче того же Shell.Application метка Type? По ней и ориентироваться: папка или файл, - так что...

Не понял, как это относится к обсуждаемой уникальности, и при чём тут Shell.Application...

greg zakharov пишет:

Что же до универсальности - закладываться не стоит. Почему, полагаю, догадаетесь сами.

Нет, не догадываюсь, ибо в разных контекстах это понятие может иметь разные тождества и вовсе не обязано претендовать на аналогию с совершенством или абсолютом в достижимости схожих по сути задач.

17

Re: VBScript/cmd: коды выхода/возврата через .Run

Flasher пишет:

Не понял... Нет, не догадываюсь...

Бог в помощь.

18 (изменено: Flasher, 2014-12-09 16:57:30)

Re: VBScript/cmd: коды выхода/возврата через .Run

greg zakharov пишет:

Бог в помощь.

Благодарю, но в этих вопросах она мне точно не потребуется.