Захват (сбой) вывода команды mklink

Кто-нибудь знает, почему происходит следующее, и есть ли у кого-нибудь обходной путь?

Я пытаюсь захватить вывод команды mklink (через cmd.exe mklink> out.txt)

Вывод отправляется в out.txt в порядке, если команда mklink выполнена успешно.

E.G: %comspec% /c mklink /d C:\Test C:\Windows > out.txt && notepad out.txt

Однако, если команда недействительна или не удалась, в файл out.txt ничего не будет записано.

Например: Run above command again (сбой, потому что C:\Test уже существует) или

E.G: %comspec% /c mklink > out.txt && notepad out.txt

Я использую команду в VBScript, кто-нибудь знает, как захватить вывод mklink, если команда не выполнена успешно?

Set o_shell = CreateObject("Wscript.Shell")
Set o_fso = CreateObject("Scripting.FileSystemObject")
mklinkCommandOutput = GetCommandOutput("mklink /D ""C:\Test"" ""C:\Windows""")
WScript.echo mklinkCommandOutput

Function GetCommandOutput(runCmd)
  on error resume next
  Dim o_file, tempFile: tempFile = o_shell.ExpandEnvironmentStrings("%TEMP%") & "\tmpcmd.txt"

  ' Run command and write output to temp file
  o_shell.Run "%COMSPEC% /c " & runCmd & " > """ & tempFile & """", 0, 1

  ' Read command output from temp file
  Set o_file = o_fso.OpenTextFile(tempFile, 1)
  GetCommandOutput = o_file.ReadAll
  o_file.Close

  ' Delete temp file
  Set o_file = o_fso.GetFile(tempFile)
  o_file.Delete
End Function

person aciid    schedule 25.03.2014    source источник


Ответы (2)


(1) Согласно Используя несколько команд и символы условной обработки, символ && запускает команду справа, только если команда слева выполнена успешно. Вы должны использовать & для запуска блокнота, даже если mlink не работает.

(2) Хотя в документах mlink об этом прямо не говорится, Я предполагаю, что mlink пишет свое сообщение об ошибке в Stderr (см. здесь) - точно так же, как dir.

Доказательство:

dir 01.vbs
...
19.10.2012  11:29             2.588 01.vbs
...
(dir succeeded)

dir nix
...
File Not Found
(dir failed)

dir nix && echo nothing to see, because lefty failed
...
File Not Found
(dir failed, no output because of &&)

dir nix & echo much to see, although lefty failed
...
File Not Found
much to see, although lefty failed
(dir succeeded, echo done because of &)

(3) Чтобы зафиксировать вывод mlink (или dir), независимо от того, произошел ли сбой или нет, и отобразить результат (файл) в блокноте, вы должны использовать

dir 01.vbs 1> out.txt 2>&1 & notepad out.txt
dir nix 1> out.txt 2>&1 & notepad out.txt

для перенаправления Stdout и Stderr в выходной файл.

Доказательство:

DOS и блокноты

person Ekkehard.Horner    schedule 25.03.2014
comment
Тоже только что понял - ура! Я просто использовал && блокнот, чтобы попытаться открыть выходной файл, чтобы показать вам, ребята, но еще раз спасибо за советы - person aciid; 25.03.2014
comment
+1 за использование ссылки на команды. Я не совсем понимаю блок доказательств, который вы иногда используете в своих ответах. Я получаю журнал выполнения кода в реальном времени. Я просто не вижу объяснения этому. - person Rich; 27.03.2014

Рассматривали ли вы возможность использования команды «Exec» вместо команды «Выполнить» и сбора результатов вывода?

Это не требует файла, и это просто проще.

Новый код

Function GetCommandOutput(runCmd)
  Dim WshShell, oExec
  Set WshShell = CreateObject("WScript.Shell")
  Set oExec    = WshShell.Exec("%COMSPEC% /c " & runCmd)
  GetCommandOutput = oExec.StdOut.ReadAll
End Function 

Старый код

Function GetCommandOutput(runCmd)
  on error resume next
  Dim o_file, tempFile: tempFile = o_shell.ExpandEnvironmentStrings("%TEMP%") & "\tmpcmd.txt"

  ' Run command and write output to temp file
  o_shell.Run "%COMSPEC% /c " & runCmd & " > """ & tempFile & """", 0, 1

  ' Read command output from temp file
  Set o_file = o_fso.OpenTextFile(tempFile, 1)
  GetCommandOutput = o_file.ReadAll
  o_file.Close

  ' Delete temp file
  Set o_file = o_fso.GetFile(tempFile)
  o_file.Delete
End Function 
person Rich    schedule 25.03.2014
comment
Я пытался использовать Exec раньше, даже добавляя цикл для ожидания статуса команды, но это всегда один и тот же результат, как если бы я запускал это: pastebin.com/raw.php?i=axHVLLSz - person aciid; 25.03.2014
comment
Хорошо, GetCommandOutput = oExec.StdErr.ReadAll работает :) проблема решена, милая - person aciid; 25.03.2014