2017-01-27 2 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는 텍스트 스트림을 반환합니다. count를 확인하기 위해 if 조건을 배치하면이 함수의 나머지 코드는 건너 뜁니다. 왜이 코드를 건너 뛰는 지 이해할 수 없습니다.FileSystemObject count 속성이 dir 명령에 의해 반환 된 파일 목록을 처리하는 방법

내 생각에, 아래 문서 에서처럼 Count 속성은 Dictionary 개체를 처리합니다. objPropFilesList는 파일 이름 목록을 반환하지만 사전 객체로 간주되지 않습니다.

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

나는 바로 여기 일이 무엇인지 이해하고 싶다.

+0

은'objPropFilesList'는 그것이 오류없는 경우 'Count' 속성을 갖지 않는'TextStream' 객체 및 그냥 * "건너 뜁니다"* 그럴 가능성이있는 원인은 질문에 표시되지 않은 코드의 어딘가에서 길잃은'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 속성에 액세스하여 발생하는 오류는 악한 글로벌 OERN ((C) Lankymart)에 의해 숨겨진
  2. 쉽게 .AtEndOfStream을 사용할 수 있습니다 결과를 반복하지 않고 실패를 기록해야하는지 여부를 결정합니다.
  3. 정말 TextStream에서 Split을 사용할 수 없습니다.

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

스크립트를 제공해 주셔서 감사합니다. –

관련 문제