2014-04-04 6 views
0

처음에는 이것을 일괄 적으로 작성했지만 ASCII로 사용할 수있는 토큰의 수는 너무 적어서 26 개만 허용되며 35 파이프가 필요합니다. 결과물 파일.VbScript로 35 파이프의 파일에서 후미 파이프를 자르려면

나는 VBScript를 처음 사용하지만 근본적으로 원본 파일을 읽으려면 파일의 첫 번째 문자를 마지막 35 개의 파이프 (그리고 그 사이의 모든 공간, 심지어는 두 공간 사이의 공간) 파이프가 비어 있음). 그런 다음 원래 파일의 무결성을 유지하면서 해당 파일을 다른 파일로 출력합니다. 그래서 그 이유는 확실하지 않다 ...

' ************** 
' ** Anthony B. 
' ************** 
' ** PipeDropper 
' ************** 
Dim WshShell, oExec 
Set wshShell = CreateObject("WScript.Shell") 
Set objFSO = CreateObject("Scripting.FileSystemObject") 

Set objInputFile = objFSO.OpenTextFile("C:\Users\aborgetti\Desktop\Pipe Delimiter Project\oauthrn.cms",1) 
Set objOutputFile = objFSO.OpenTextFile("C:\Users\aborgetti\Desktop\Pipe Delimiter Project\output.txt",8,True) 

Do until objInputFile.AtEndofStream 
    strcomputer = objInputFile.ReadLine 
    strCommand = "dsquery computer -name " & strComputer 
    Set oExec = WShShell.Exec(strCommand) 
    If (oExec.Status = 0) Then 
     If (oExec.stdOut.ReadAll = "") Then 
      objOutputFile.WriteLine(strComputer) 
     End If 
    End If 
Loop 

objInputFile.Close 
objOutputFile.Close 

문제

Set oExec = WShShell.Exec(strCommand) 가 지정한 것 파일을 찾을 수 없습니다라고이 줄 : 여기

지금까지 내 코드입니다 나쁜.

그런 다음 여기에서 어디로 가야합니까?

미리 감사드립니다.

UPDATE 여기

은 지난 01 요구 후

RE|922124607|1 |KimV|HOS99999|Y|N|2014-04-02 15:49:14|2014-04-02 15:49:58|Y|2014-04-02 00:00:00|R9815|01|1 |2014-04-02 00:00:00|493.90||||2016-04-02|N||HOS99999|||06|PROV99999|2014-04-02 15:48:20|2014-04-02||R9815|2014-04-02 00:00:00|2016-04-02 00:00:00||||||98960|06 |08|6|6|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||02|||||||Z4|2014-04-02 15:49:58|04|001|01|***|PMER|***|***|2013-08-01|||||||||||||||||||||||||||||||||||||||| 

다 가고 ... 일반적으로 어디서나 10 ~ 100 배에서, 파일에 될 줄은 ... 그래서 :

|***|PMER|***|***|2013-08-01|||||||||||||||||||||||||||||||||||||||| 

은 다음과 같아야합니다

Start of line ... |***|PMER|***|***|2013-08-01 
+0

줄의 모양과 추출 할 내용을 보여줄 수 있습니까? – shahkalpesh

+1

위와 같이 문자가 파이프인지 테스트하려고 시도하는 것도 없습니다. 너는 90 % 거기에있다. 계속 가라. 선을 읽으므로 회선을 반복하거나 대신 문자를 읽은 다음 각 문자가 파이프인지 확인하고 카운터를 증가시킵니다. –

+0

두 번째 질문에서도 첫 번째 질문과 어떻게 관련이 있는지 보지 못합니까? 그건 "|"의 수와 아무 관련이 없습니다. 문자는 지금까지 읽었다. 그것이 실패한 경우 전달 된 명령 또는 "strComputer"가 dquery 명령과 전달되는 내용 중 무엇인지에 대한 것입니다. –

답변

2

나는 문제

  1. 가 게시 된 코드가 오류 424 "을 얻을 수있는 방법은 두 가지가 있습니다

오류를 발생시킨 코드입니다

  • 파이프와 아무 상관이 있는지 의심 객체가 필요합니다 "와 같은 명령문의 경우

    Set a = b.c(d) 
    

    첫 번째 (명백한) : b는 개체가 아닙니다. 두 번째 : b.c (d)의 반환 값은 객체가 아닙니다.

    코드는 응축 :

    Set wshShell = CreateObject("WScript.Shell") 
    strCommand = "hostname" 
    Set oExec = WShShell.Exec(strCommand) 
    WScript.Echo oExec.Stdout.Readline() 
    

    실행을 문제없이. 약간의 변경 :

    Set wshShell = CreateObject("WScript.Shell") 
    strCommand = "hostname" 
    Set oExec = WShShel1.Exec(strCommand) 
    WScript.Echo oExec.Stdout.Readline() 
    

    은 "필요한 개체"로 실패합니다. 오타가 있니?왜 도움 "명시 적 옵션"을하지 당신 :

    Option Explicit 
    Dim wshShell : Set wshShell = CreateObject("WScript.Shell") 
    Dim strCommand : strCommand = "hostname" 
    Dim oExec  : Set oExec = WShShel1.Exec(strCommand) 
    WScript.Echo oExec.Stdout.Readline() 
    

    출력 : 더 오타 문제가 발생하지 있는지 확인 한 경우

    ...\22871772.vbs(4, 18) Microsoft VBScript runtime error: Variable is undefined: 'WShShel1' 
    

    , 당신은 변수가 변경/할당 여부를 확인해야합니다 로 초기화 및 사용 사이 :

    Option Explicit 
    Dim wshShell : Set wshShell = CreateObject("WScript.Shell") 
    Dim strCommand : strCommand = "hostname" 
    '... 
    wShSheLL = "oops" 
    '... 
    Dim oExec  : Set oExec = WShShell.Exec(strCommand) 
    WScript.Echo oExec.Stdout.Readline() 
    

    다시 오류 424

    업데이트 WRT 실패 하는 정규식 보인다의 |

    >> n = 8 + 1 
    >> s = "|abc123|1*|004|**gobbligook|001|%|2014-01-01|||||||||||||" 
    >> a = Split(s, "|", n) ' <-- 9th elm get all the junk 
    >> WScript.Echo UBound(a) 
    >> a(n - 1) = "" ' <-- zap the junk 
    >> WScript.Echo Join(a, "|") 
    >> 
    8 
    |abc123|1*|004|**gobbligook|001|%|2014-01-01| 
    

    이의 꼬리를 삭제하려면 : pipes :

    나는 Split()가 후행 파이프를 다루는 (카운트가 #pipes로 설정 당신은 + 1 할)를 선택할 것 더 적절 :

    >> set r = New RegExp 
    >> r.Pattern = "\|+$" 
    >> WScript.Echo r.Replace(s, "") 
    >> 
    |abc123|1*|004|**gobbligook|001|%|2014-01-01 
    
  • +0

    Ekkehard에 감사드립니다. – Hituptony

    +0

    훌륭한 답변입니다. Split을 사용하는 것에 대해서는별로 확신 할 수 없습니다. 마지막 배치가 23 파이프 중 마지막 배치 (35 개 파이프 배치 중)가 마지막 배치라고한다면 어떻게 될까요? 질문은 단 하나의 '후행'파이프에 관한 것만은 아닌 것 같습니다. 필자는 각 문자 테스트를 읽고 파이프 카운터를 적절하게 증가시키기 위해'Stream.Read'를 사용하는 것이 더 나을 것이라고 생각합니다. 그러나 2/3의 대답은 황금이며 'Option Explicit'이 'Option'이되어서는 안되는 이유에 대한 좋은 예입니다. –

    +0

    편집 : 질문의 첫 번째 부분은 파이프에 관한 것 같지만 OP 코드 뒤에 완전히 다른 것으로 보이는 것 같습니다. 그래서 머리 또는 그것의 꼬리를 만들기위한 +1) –