2013-10-29 2 views
0

다음과 같은 출력을주는 프로그램이 있습니다.VBscript를 사용하여 텍스트를 찾고 변수에 할당

Listing 3 device(s) for setup class "Ports" (Ports (COM & LPT)). 
USB\VID_067B&PID_2303\5&164808BA&0&3      : Prolific USB-to-Serial Comm Port (COM3) 
USB\VID_068B&PID_2304\5&164808BA&0&3      : Prolific USB-to-Serial Comm Port (COM4) 
USB\VID_069B&PID_2305\5&164808BA&0&3      : Prolific USB-to-Serial Comm Port (COM6) 

나는 밖으로 COM 번호 값을 얻을 그래서

P1=COM3 
P2=COM4 
P3=COM6 

페르소나이 링크 http://vbcity.com/forums/t/154919.aspx 내가 선을 사용하여 원하는 출력을 받고 같은 VBScript를 사용하여 변수에 할당하고 싶습니다.

System.IO.Ports.SerialPort.GetPortNames 

그러나이 스크립트를 구현하는 방법은 확실하지 않습니다.

감사합니다.

답변

1

나는 당신의 출력을 가지고 가고 OUTPUT.TXT라는 텍스트 파일에 저장, 그래서 그것을 실행하는 데 사용하고 명령은 다음과 같습니다

TYPE OUTPUT.TXT 

그러나, 실제와 TYPE OUTPUT.TXT을 대체 주시기 프로그램. 다음 VBScript은이 명령을 실행하고 VBScript의 출력을 캡처하고 구문 분석하는 방법을 보여줍니다. 내가 필요로하는 문자열을 찾아 추출 INSTRMID를 사용

Dim objShell 
Set objShell = CreateObject("WScript.Shell") 
Dim objExec 
Set objExec = objShell.Exec("CMD /C TYPE OUTPUT.TXT") 
Dim lines 
lines = objExec.StdOut.ReadAll 
Dim line 
Dim P(10) 
Dim num 
num = 0 
For Each line in split(lines, vbCrLf) 
    Dim idx 
    idx = InStr(line, "Prolific USB-to-Serial Comm Port (") 
    If idx > 0 Then 
    idx = idx + 34 
    Dim idx2 
    idx2 = InStr(idx, line, ")") 
    num = num + 1 
    P(num) = Mid(line, idx, idx2 - idx) 
    WScript.Echo "P" & num & "=" & P(num) 
    End If 
Next 
+0

이것은 작동하는 것처럼 보입니다. 여러 옵션을 사용할 수 있는지 집에 돌아올 때까지 기다려야 할 것입니다. 호기심에서 벗어나, Dim을 사용하여 VBscript에서 변수를 기록하는 것은 무엇입니까? 나는 당신이 그것을한다고 가정하고 있지만, 내가하지 않으면 차이를 발견하지 못했다고 읽었습니다. 그것이 스크립트에 혼란을 더하는 것처럼 보입니다. – jeffpkamp

+0

'DIM'은 차원을 의미하며, 역사적으로 'BASIC'의 배열 크기를 선언하는 데 사용되었습니다. 그러나 모든 변수를 선언하기 위해 다시 작업했습니다. 좋은 연습 문제 일 뿐이지 만,'VBScript'는 기본적으로이 방법을 강요하지 않습니다. 일반적으로, 스크립트를 작성할 때'OPTION EXPLICIT'을 사용하여이 동작을 강제해야합니다. 이것은 오타를 덫을 놓을 것이다. 예를 들어 필자가 작성한 스크립트에서 실수로 변수를 잘못 입력하면 스크립트가 오류를 발생시키는 대신 잘못 실행됩니다. –

+0

그래서이 문제는 주로 스크립트의 나머지 부분에 피드를 생성하기 위해 변수를 생성해야하기 때문에 P1 = COM1, P2 = COM2 인 메시지 상자 대신 P1 = COM1. 나는 P (num) = PORT를 넣을 수 없다는 것을 알았다. – jeffpkamp

0

다른 질문이 있습니다. Win32_SerialPort 클래스에서 WMI를 가져올 수 있어야합니다. 이게 도움이 되나요?

On Error Resume Next 

strComputer = "." 

Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/CIMV2") 
Set colInstances = objWMIService.ExecQuery("SELECT * FROM Win32_SerialPort") 

If colInstances.Count = 1 Then 
    WScript.Echo "1 instance:" & vbCrLf 
Else 
    WScript.Echo colInstances.Count & " instances:" & vbCrLf 
End If 

For Each objInstance In colInstances 
    WScript.Echo "Availability    : " & objInstance.Availability 
    WScript.Echo "Binary      : " & objInstance.Binary 
    WScript.Echo "Capabilities    : " & Join(objInstance.Capabilities, ",") 
    WScript.Echo "CapabilityDescriptions  : " & Join(objInstance.CapabilityDescriptions, ",") 
    WScript.Echo "Caption      : " & objInstance.Caption 
    WScript.Echo "Description     : " & objInstance.Description 
    WScript.Echo "DeviceID     : " & objInstance.DeviceID 
    WScript.Echo "Name      : " & objInstance.Name 
    WScript.Echo "PNPDeviceID     : " & objInstance.PNPDeviceID 
    WScript.Echo "ProviderType    : " & objInstance.ProviderType 
    WScript.Echo 
Next 
+0

이 스크립트는 0 인스턴스와 함께 제공됩니다. 직렬 포트가 실제로 USB> 직렬 어댑터라는 문제가있을 수 있으므로 WIN32_serialport 아래에 나열되지 않을 수도 있습니다. – jeffpkamp

관련 문제