【问题标题】:Issues parsing list of variables in cscript array解析 cscript 数组中的变量列表时出现问题
【发布时间】:2015-10-01 05:00:32
【问题描述】:

所以我一直在慢慢尝试自学VBscript,主要是从互联网上复制代码,并合并功能和概念以实现我想要的目标。我觉得发布这个问题很愚蠢,但我正在撞上一堵精神砖墙,这让我发疯!

场景:所以这是一个从多个来源复制的脚本,我试图合并和编辑。基本上我有一个调用这个 VBS 文件的批处理脚本:批处理有多个变量。第一组变量是一堆用空格分隔的 KB #(例如:971033 2952664),最后一个变量告诉 VBS 将这个脚本的 LOG 文件存储在哪里。我弄乱了编码,它似乎正确地解析了变量(例如:第 17-21 行在各行中列出了大约 20 个变量)但无论出于何种原因,我的 FOR 循环从第 35 行开始似乎导致了一个巨大的日志包含许多重复条目的文件。首先,这是调用VBS的BAT(例如编辑):

set LOG=%~dp0log.log
IF /I "%OSVER%" == "7" (
    FOR /f "skip=8 eol=; delims=    # tokens=1" %%A IN (KB.ini) DO (
        SET KB=!KB! %%A
    )
)
CSCRIPT //NOLOGO Script.vbs%KB% "%LOG%"

当传递给 vbs 文件时,最终命令看起来像这样(示例):

CSCRIPT //NOLOGO Script.vbs 2902907 2922324 2976987 "C:\Users\My Owner\Destop\log.log"

脚本.VBS

On Error Resume Next
If Wscript.Arguments.Count < 1 Then
    WScript.Quit 1
End If

Dim fso, updateSession, updateSearcher, dt
Set fso = CreateObject("Scripting.FileSystemObject")
Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher = updateSession.CreateUpdateSearcher()

Dim logPath
set logPath = fso.OpenTextFile(Wscript.Arguments(Wscript.Arguments.Count - 1), 8, True)

Dim kbList()
For i = 0 to Wscript.Arguments.Count - 2
    Redim Preserve kbList(i)
    kbList(i) = Wscript.Arguments(i)
Next


For Each hotfixId In kbList
    Wscript.Echo hotfixId
Next

Log (" - Searching for updates (Please wait)"), True
Dim searchResult
Set searchResult = updateSearcher.Search("IsInstalled=0")
Log ("   - " & CStr(searchResult.Updates.Count) & " found"), True
Log (" - Hiding Updates"), True

Dim index, index2, update, kbArticleId
For index = 0 To searchResult.Updates.Count - 1
    Set update = searchResult.Updates.Item(index)
    For index2 = 0 To update.KBArticleIDs.Count - 1
        kbArticleId = update.KBArticleIDs(index2)
        For Each hotfixId in kbList
            If hotfixId = kbArticleId Then
                If update.IsHidden = False Then
                    Log ("   - Hiding KB" & hotfixId), True
                    update.IsHidden = True
                Else
                    Log ("   - KB" & hotfixId & " already hidden"), True
                End If          
            Else
                Log ("   - KB" & hotfixId & " not found"), True
            End If
        Next
    Next
Next

'Function for logging
Function log(logStr, toConsole)
    If toConsole Then
        WScript.Echo logStr
        logPath.WriteLine logStr
    Else
        logPath.WriteLine logStr
    End If
End Function

'Close log file
logPath.Close
'// EOF

代码对我来说看起来很棒,但日志文件讲述了一个不同的故事。这是生成的日志:

- Searching for updates (Please wait)
  - 58 found
- Hiding Updates
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB not found
  - KB971033 already hidden
  - KB not found
  - KB not found
  - KB not found
  - KB3021917 already hidden
  - KB not found
  - KB not found
  - KB3068708 already hidden
  - Hiding KB2952664
  - KB not found
  - KB not found
  - KB not found
  - KB3075249 already hidden
  - KB3080149 already hidden
  - KB3083324 already hidden
  - KB not found
  - KB not found

等等等等……

日志出现在 1024 行(有趣....),如果你仔细观察,“已经隐藏”的消息确实经常出现,所以脚本似乎有点工作,但它正在循环每个变量每轮(例如:20 个变量 x 20 循环 = 400 行)

我必须错过一些东西,但我一生都无法弄清楚。请问,我犯了什么小错误,我该如何解决这个问题?

【问题讨论】:

    标签: batch-file vbscript


    【解决方案1】:

    比较逻辑错误:只检查kbList的第一个元素是否等于当前kbArticleId

    解决方案:使用布尔标志并在整个内部循环完成后检查它:

    Dim found
    For index2 = 0 To update.KBArticleIDs.Count - 1
        kbArticleId = update.KBArticleIDs(index2)
        found = False
        For Each hotfixId in kbList
            If hotfixId = kbArticleId Then
                found = True
                If update.IsHidden = False Then
                    Log ("   - Hiding KB" & hotfixId), True
                    update.IsHidden = True
                Else
                    Log ("   - KB" & hotfixId & " already hidden"), True
                End If          
            End If          
        Next
        If found = False Then
            Log ("   - KB" & hotfixId & " not found"), True
        End If
    Next
    

    【讨论】:

    • 谢谢 wOxxOm,我改变了你的建议,但是我在 'Dim found = True' 上得到了一个错误我删除了 Dim 并将它放在最上面,但是日志的输出很多短得多,但仍有空白条目。我已经用新结果更新了主帖子中的日志。附:有 20 KB 变量,但日志中有 55 KB 行。
    • 不要放在最上面,把dim去掉就行了,否则每篇文章的值都不会重置。
    • 谢谢!这解决了问题! (在一定程度上)它似乎正在工作,但是通过一些放置良好的 echo 命令,我意识到我的逻辑方法也存在缺陷。感谢您帮助使其发挥作用:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多