2017-01-27 23 views
-1
Function Run_Cmd(strCmd) 
    Dim objShell 
    Dim objScriptExec 
    Dim strCmdResult 

    strCmd = "%comspec% /C " + strCmd 

    Set objShell = CreateObject("WScript.Shell") 
    Set objScriptExec = objShell.exec(strCmd) 

    set Run_Cmd = objScriptExec.StdOut 

End Function 

Function test() 
    '... 
    Set objPropFilesList = Run_Cmd("dir /B " & sStarterDir & " | findstr /I """&test_list&"""") 

    if (objPropFilesList.count = 0) Then 
     LogWrite "No EPM services found to verify... Aborting execution.", fAutoFixLog, bLogToConsole 
     wscript.echo "No EPM services found to verify... Aborting execution." 
     Exit Function 
    End If 


    Do Until objPropFilesList.AtEndOfStream 
     '... 
    Loop 

End Function 

В приведенном выше коде objPropFilesList возвращает текстовый поток. Когда я установил условие проверки счета, он пропускает оставшийся код в этой функции. Я не понимаю, почему он пропускает этот код.Как свойство подсчета файлов FileSystemObject обрабатывает список файлов, возвращаемых командой dir

Мое недоразумение заключается в том, что, согласно ниже, doc Count Property обрабатывает объект Dictionary. ObjPropFilesList возвращает список имен файлов, не будет ли это рассматриваться как объект словаря.

https://msdn.microsoft.com/en-us/library/ea5ht6ax(v=vs.84).aspx

Я хочу, чтобы понять, что именно здесь происходит.

+0

Параметр 'objPropFilesList' является' TextStream' объект, который не имеет 'свойство Count', если это не ошибка и просто * «пропускает» *, то вероятной причиной является неверная строка 'On Error Resume Next' где-то в коде, который не показан в вопросе. Если 'On Error Resume Next' установлен где-то в глобальной области, он будет влиять на все, поэтому при возникновении ошибок они будут пропущены. – Lankymart

ответ

-1

Вы используете консольную команду и захватываете вывод в текстовом потоке. Это просто текст. Вы можете преобразовать в массив строк. A = Split(A, vbcrlf).

Это показывает, как выполнять операции с файлами в VBScript. Это использует рекурсию, чтобы получить операцию типа dir /s.

'On Error Resume Next 
Set fso = CreateObject("Scripting.FileSystemObject") 
Dirname = InputBox("Enter Dir name") 

ProcessFolder DirName 

Sub ProcessFolder(FolderPath) 
    On Error Resume Next 
    Set fldr = fso.GetFolder(FolderPath) 

    Set Fls = fldr.files 

    For Each thing in Fls 
     msgbox Thing.Name & " " & Thing.path 
    Next 


    Set fldrs = fldr.subfolders 
    For Each thing in fldrs 
     msgbox Thing.Name & " " & Thing.path 
     ProcessFolder thing.path 
    Next 

End Sub 
+0

Если какое-либо несуществующее свойство передано, оно не вызывает никаких ошибок? и почему он пропускает код в следующей строке. Можете ли вы объяснить, что именно происходит в моем сценарии. –

+0

Первый абзац - вздор; отдых не отвечает на вопрос. –

+0

@ Ekkehard.Horner, конечно, если вы используете 'ReadAll()', вы можете использовать 'Split()' на нем? Поэтому я бы не стал так говорить, что это «глупость» *. – Lankymart

-1

Чтобы продемонстрировать:

  1. Ошибка вызван доступом к несуществующему .Count собственности была скрыта Злой глобальной ОЭРН ((с) Lankymart)
  2. Вы можете легко использовать .AtEndOfStream чтобы определить, нужно ли регистрировать сбой, а не перебирать результаты.
  3. Вы действительно не можете использовать Split в TextStream.

WTF

Option Explicit 

Function Run_Cmd(ByVal strCmd) ' nasty surprises without ByVal as you change strCmd in the function 
' Dim strCmdResult - not used; proves that 'long' Dim lists 'far' from the use of the variables are a bad idea 
    strCmd = "%comspec% /C " + strCmd 
    Set Run_Cmd = CreateObject("WScript.Shell").exec(strCmd).StdOut 
End Function 

Dim sPat : sPat = "vbs" 
If 1 <= WScript.Arguments.Count Then sPat = WScript.Arguments(0) 

Dim tsCmd : Set tsCmd = Run_Cmd("dir /B .\* | findstr /I """ & sPat & """") 
WScript.Echo TypeName(tsCmd) 

' OERN *hides* errors 
On Error Resume Next 
    tsCmd = Split(tsCmd, vbCrLf) 
    WScript.Echo Err.Number, Err.Description 
On Error GoTo 0 

' use tsCmd.AtEndOfStream to determine whether to log before you loop over the lines 
If tsCmd.AtEndOfStream Then 
    WScript.Echo "Log: No EPM" 
Else 
    Do Until tsCmd.AtEndOfStream 
     WScript.Echo tsCmd.ReadLine() 
    Loop 
End If 

выход:

cscript 41887615.vbs 
TextStream 
438 Das Objekt unterstützt diese Eigenschaft oder Methode nicht. 
41887615.vbs 

cscript 41887615.vbs pipapo 
TextStream 
438 Das Objekt unterstützt diese Eigenschaft oder Methode nicht. 
Log: No EPM 
+0

Спасибо за ваш сценарий. –