VB脚本输出特定值

时间:2016-03-02 16:41:38

标签: variables vbscript split

我认为我可以将此作为一种独特的方式发布,将输出作为文本而不是整数返回,以查看是否可以帮助其他人遇到与我相同的问题。

我想要完成的是保持命令的输出,但是然后将特定输出作为文本输出而不是基于interger。

这是我到目前为止所做的,目前我仍然坚持过滤输出。我知道我可以使用mid命令,但由于此命令的输出通常是流畅的,我不能使用mid来计算特定字符。

有问题的命令是PowerShell.exe manage-bde -status C: 输出是这样的:

Volume C: [OSDisk]
[OS Volume]

    Size:                 118.24 GB
    BitLocker Version:    Windows 7
    Conversion Status:    Fully Encrypted
    Percentage Encrypted: 100%
    Encryption Method:    AES 256
    Protection Status:    Protection On
    Lock Status:          Unlocked
    Identification Field: None
    Key Protectors:
        Numerical Password
        TPM

我需要从例如转换状态中提取一些信息。我希望它告诉我它是100%,还是0%......或者不管它是什么。我似乎无法拉开那条线。

这是我到目前为止所拥有的。

dim outputArray
dim inputText
dim message
Dim strText


Set objShell = WScript.CreateObject("WScript.Shell")
Set objExecObject = ObjShell.Exec("PowerShell.exe manage-bde"" -status C:")
Do While Not objExecObject.StdOut.AtEndOfStream
    strText = objExecObject.StdOut.ReadLine()
inputText = strText

outputArray = split(inputText,"Converstion Status:")

for each x in outputArray
  message = message & x & vbCRLF
next

msgbox message

Loop

这是逐行拉,我知道转换状态是第3行,所以可能会引导该行并将100%回显到我可以作为单独输出存储的变量。

更新:我决定不通过解析输出到文本文件的方法。必须有更好的方法和更短的代码来完成这种方法,再加上Bitlocker变量在输出上改变,我的线方法可能不起作用。

我现在正试图看看我是否可以使用for / F搜索方法来查找字符串并设置变量。我这样做的目标是将其添加到包含这些报告值的注册表项

这是我修改后的代码。

dim outputArray
dim inputText
dim message
Dim strText
dim line
dim testCase
dim strConversion
dim Currentline


Set objShell = WScript.CreateObject("WScript.Shell")
Set objExecObject = ObjShell.Exec("PowerShell.exe manage-bde"" -status C:")
Do While Not objExecObject.StdOut.AtEndOfStream
    strText = objExecObject.StdOut.ReadLine()
strConversion = "for /F ""delims="" %%a in (strText) do do findstr /M /i /C:'Conversion' C:\%i var=%%a"
Wscript.echo strConversion


Loop

这是逐行拉,我知道转换状态是第3行,所以可能会引导该行并将100%回显到我可以作为单独输出存储的变量。

更新:我决定不通过解析输出到文本文件的方法。必须有更好的方法和更短的代码来完成这种方法,再加上Bitlocker变量在输出上改变,我的线方法可能不起作用。

我现在正试图看看我是否可以使用for / F搜索方法来查找字符串并设置变量。我完成所有这些操作的目标是将其添加到包含这些值以进行报告的注册表项中。

这是我修改后的代码。

dim outputArray
dim inputText
dim message
Dim strText
dim line
dim testCase
dim strConversion
dim Currentline


Set objShell = WScript.CreateObject("WScript.Shell")
Set objExecObject = ObjShell.Exec("PowerShell.exe manage-bde"" -status C:")
Do While Not objExecObject.StdOut.AtEndOfStream
    strText = objExecObject.StdOut.ReadLine()
strConversion = "for /F ""delims="" %%a in (strText) do findstr /M /i /C:'Conversion' C:\%i var=%%a"
Wscript.echo strConversion


Loop

到目前为止,当它运行时,它会将线条返回14次,这是直接运行命令时的线数。所以,它正在看到它,只是没有完全解析数据。 “转换”是我正在检查的字符串之一。

我不想做更长代码的另一个原因是这是一个已经有很多行的脚本的一部分,这将是一个最终的子流程。

3 个答案:

答案 0 :(得分:0)

尝试将输出存储到数组中,如下代码所示:

Option Explicit
Dim arrData,Data
If Not WScript.Arguments.Named.Exists("elevate") Then
    CreateObject("Shell.Application").ShellExecute WScript.FullName _
    ,WScript.ScriptFullName & " /elevate", "", "runas", 1
    WScript.Quit
End If

arrData = Run_PS_Script
MsgBox arrData(6)
'To get all data from this loop For...Next
For Each Data in arrData
    MsgBox Data
Next

'*****************************************************************
Function Run_PS_Script()
    Dim WshShell,Command,PSFile,ret,fso,file,text,Temp
    Set WshShell = CreateObject("WScript.Shell")
    Temp = WshShell.ExpandEnvironmentStrings("%Temp%")
    Command = "cmd /c echo manage-bde -status C: ^|" &_ 
    "Out-File %temp%\output.txt -Encoding ascii > %temp%\PSFile.ps1"
    PSFile = WshShell.Run(Command,0,True)
    ret = WshShell.Run("powershell.exe -ExecutionPolicy Unrestricted -File %temp%\PSFile.ps1",0,True)
    Set fso  = CreateObject("Scripting.FileSystemObject")
    text = ReadFile(Temp &"\output.txt","byline") 
    Run_PS_Script=text
End Function
'*****************************************************************
Function ReadFile(path,mode)
    Const ForReading = 1
    Const TriStateUseDefault = -2
    Dim objFSO,objFile,i,contents,strLine
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    If mode = "unicode" Then
        Set objFile = objFSO.opentextfile(path,,,true)
        contents = objFile.ReadAll
        ReadFile = contents
        objFile.Close
    End If
    If mode = "byline" then
    Set objFile = objFSO.OpenTextFile(path,ForReading)
        Dim arrFileLines()
        i = 0
        Do Until objFile.AtEndOfStream
            Redim Preserve arrFileLines(i)
            strLine = objFile.ReadLine
            strLine = Trim(strLine)
            If Len(strLine) > 0 Then
                arrFileLines(i) = strLine
                i = i + 1
                ReadFile = arrFileLines
            End If    
        Loop
        objFile.Close
    End If
    If mode = "all"  Then
    Set objFile = objFSO.OpenTextFile(path,ForReading)
        contents = objFile.ReadAll
        ReadFile = contents
        objFile.Close
    End If
End Function
'*****************************************************************

答案 1 :(得分:0)

好的,我想再发一次变化。这个怎么样?

  when: item.name == app or app == false

我现在已经得到了它将返回该行的0或5值。如何将5响应转换回来自该行的实际文本?

答案 2 :(得分:0)

以下是从VBS中的字符串数组中提取值的示例:

' let us mock out our expected data returned from the disk
Dim sampleData(100)
sampleData(0) = "Volume C: [OSDisk]"
sampleData(1) = "[OS Volume]"
sampleData(2) = ""
sampleData(3) = "    Size:                 118.24 GB"
sampleData(4) = "    BitLocker Version:    Windows 7"
sampleData(5) = "    Conversion Status:    Fully Encrypted"
sampleData(6) = "    Percentage Encrypted: 100%"
sampleData(7) = "    Encryption Method:    AES 256"
sampleData(8) = "    Protection Status:    Protection On"
sampleData(9) = "    Lock Status:          Unlocked"
sampleData(10) = "    Identification Field: None"
sampleData(11) = "    Key Protectors:"
sampleData(12) = "        Numerical Password"
sampleData(13) = "        TPM"

'create a function to parse out the values you want
Function returnValueFromData(sampleData,fieldName)
        For each infoLine in sampleData
        If InStr(infoline,fieldName) Then
            infoline = Trim(Replace(infoline,fieldName,""))
            returnValueFromData = infoline
       End If
    Next
End Function


'now, we can use our function above to grab whatever field we want

'get the size of the disk
dim size
size = returnValueFromData(sampleData,"Size:")
wscript.echo size


'get the lock status of the disk
dim lockStatus
lockStatus = returnValueFromData(sampleData,"Lock Status:")
wscript.echo  lockStatus

'shorthand to get the encryption algorithm
wscript.echo returnValueFromData(sampleData,"Encryption Method:")