vbscript代码,用于从文本文件读取输入,避免手动操作

vbscript代码,用于从文本文件读取输入,避免手动操作,vbscript,text-files,file-io,wsh,powershell,Vbscript,Text Files,File Io,Wsh,Powershell,我在互联网上搜索Vbscript代码,从文本文件中每行读取一个输入,并将其传递给脚本中的命令。我只是一个初学者,需要帮助 基本上,我正在收集脚本,以便在我们的环境中获得挂起的服务器补丁。脚本如下所示: '# '# ServerPendingUpdates.vbs '# '# Usage: cscript ServerPendingUpdates.vbs {servername} {servername} {servername} {servername}

我在互联网上搜索Vbscript代码,从文本文件中每行读取一个输入,并将其传递给脚本中的命令。我只是一个初学者,需要帮助

基本上,我正在收集脚本,以便在我们的环境中获得挂起的服务器补丁。脚本如下所示:

    '#
    '# ServerPendingUpdates.vbs
    '#
    '# Usage: cscript ServerPendingUpdates.vbs {servername} {servername} {servername} {servername}
    '#    If no {servername} specified then 'localhost' assumed
    '#
    '# To do: Error handling
    '#
    Option Explicit
    Dim strServer        : strServer         =  GetArgValue(0,"localhost")


    '#
    '# Loop through the input parameters for each server
    '#


    Dim i
    For i = 0 To WScript.Arguments.Count - 1
        CheckServerUpdateStatus GetArgValue(i,"localhost") 'strServer
    Next

    WScript.Quit(0)

    Function CheckServerUpdateStatus( ByVal strServer )

    WScript.Echo vbCRLF & "Connecting to " & strServer & " to check software update status..."

    Dim blnRebootRequired    : blnRebootRequired     = False
    Dim blnRebootPending    : blnRebootPending     = False
    Dim objSession        : Set objSession    = CreateObject("Microsoft.Update.Session", strServer)
    Dim objUpdateSearcher     : Set objUpdateSearcher    = objSession.CreateUpdateSearcher
    Dim objSearchResult    : Set objSearchResult     = objUpdateSearcher.Search(" IsAssigned=1 and IsHidden=0 and Type='Software'")

    '#
    '#
    '#
    Dim i, objUpdate
    Dim intPendingInstalls    : intPendingInstalls     = 0

    For i = 0 To objSearchResult.Updates.Count-1
        Set objUpdate = objSearchResult.Updates.Item(I) 

        If objUpdate.IsInstalled Then
            If objUpdate.RebootRequired Then
                blnRebootPending     = True
            End If
        Else
            intPendingInstalls    = intPendingInstalls + 1
            'If objUpdate.RebootRequired Then    '### This property is FALSE before installation and only set to TRUE after installation to indicate that this patch forced a reboot.
            If objUpdate.InstallationBehavior.RebootBehavior <> 0 Then
                '# http://msdn.microsoft.com/en-us/library/aa386064%28v=VS.85%29.aspx
                '# InstallationBehavior.RebootBehavior = 0    Never reboot
                '# InstallationBehavior.RebootBehavior = 1    Must reboot
                '# InstallationBehavior.RebootBehavior = 2    Can request reboot
                blnRebootRequired     = True
            End If

        End If
    Next

    WScript.Echo strServer & " has " & intPendingInstalls & " updates pending installation"

    If blnRebootRequired Then
        WScript.Echo strServer & " WILL need to be rebooted to complete the installation of these updates."
    Else
        WScript.Echo strServer & " WILL NOT require a reboot to install these updates."
    End If


    '#
    '#
    '#
    If blnRebootPending Then
        WScript.Echo strServer & " is waiting for a REBOOT to complete a previous installation."
    End If 
End Function



'#
'#
'#
Function GetArgValue( intArgItem, strDefault )
    If WScript.Arguments.Count > intArgItem Then
        GetArgValue = WScript.Arguments.Item(intArgItem)
    Else
        GetArgValue = strDefault
    End If
End Function
'#
“#ServerPendingUpdates.vbs
'#
“#用法:cscript ServerPendingUpdates.vbs{servername}{servername}{servername}{servername}{servername}”
“#如果未指定{servername},则假定为“localhost”
'#
“#要做的事情:错误处理
'#
选项显式
Dim strServer:strServer=GetArgValue(0,“本地主机”)
'#
“#循环每个服务器的输入参数
'#
昏暗的我
对于i=0到WScript.Arguments.Count-1
CheckServerUpdateStatus GetArgValue(i,“本地主机”)的strServer
下一个
WScript.Quit(0)
函数CheckServerUpdateStatus(ByVal strServer)
WScript.Echo vbCRLF&“连接到”&strServer&“检查软件更新状态…”
Dim blnRebootRequired:blnRebootRequired=False
Dim blnRebootPending:blnRebootPending=False
Dim objSession:Set objSession=CreateObject(“Microsoft.Update.Session”,strServer)
Dim objUpdateSearcher:设置objUpdateSearcher=objSession.CreateUpdateSearcher
Dim objSearchResult:Set objSearchResult=objUpdateSearcher.Search(“IsAssigned=1,IsHidden=0,Type='Software'))
'#
'#
'#
模糊i,objUpdate
Dim INTPENDINGSTALLS:INTPENDINGSTALLS=0
对于objSearchResult.Updates.Count-1的i=0
Set objUpdate=objSearchResult.Updates.Item(I)
如果已安装objUpdate.i,则
如果需要objUpdate.REBOTOR,则
blnRebootPending=True
如果结束
其他的
IntPendingStalls=IntPendingStalls+1
“如果objUpdate.rebootRequested,则”####此属性在安装前为FALSE,仅在安装后设置为TRUE,以指示此修补程序强制重新启动。
如果objUpdate.InstallationBehavior.RebootBehavior为0,则
'# http://msdn.microsoft.com/en-us/library/aa386064%28v=VS.85%29.aspx
“#InstallationBehavior.RebootBehavior=0从不重新启动
“#InstallationBehavior.RebootBehavior=1必须重新启动
“#InstallationBehavior.RebootBehavior=2可以请求重新启动
blnRebootRequired=True
如果结束
如果结束
下一个
WScript.Echo strServer&“has”&intpendingstarls&“更新挂起安装”
如果需要,则
需要重新启动WScript.Echo strServer&“才能完成这些更新的安装。”
其他的
WScript.Echo strServer&“安装这些更新不需要重新启动。”
如果结束
'#
'#
'#
如果没有,那么
WScript.Echo strServer&“正在等待重新启动以完成以前的安装。”
如果结束
端函数
'#
'#
'#
函数GetArgValue(intArgItem、strDefault)
如果WScript.Arguments.Count>intArgItem,则
GetArgValue=WScript.Arguments.Item(intArgItem)
其他的
GetArgValue=strDefault
如果结束
端函数
基本上,我正在寻找一个代码放在那里的某个地方,在那里,在CLI中执行命令后手动输入的服务器名称可以在文本文件中给出;就像文本文件中的许多服务器一样,每个服务器每行执行一个,脚本一次执行一个


干杯

-
作为参数传递时,允许从参数集合和标准输入中读取

Dim server

For Each server in WScript.Arguments.UnNamed
    If server="-" Then 
        Do While Not WScript.StdIn.AtEndOfStream
            WScript.Echo "Redirected: " + WScript.StdIn.ReadLine
        Loop
    Else 
        WScript.Echo "Argument: " + server
    End If
Next 
这允许仍然在命令行中传递参数,并且,如果任何参数是破折号,则读取stantdard输入。这将允许您执行以下任何操作

惯常辩论通过

cscript checkServers.vbs server1 server2
参数和管道输入

type servers.txt | cscript checkServers.vbs server1 server2 - 
仅重定向输入

cscript checkServers.vbs - < servers.txt
编辑以回答评论

Option Explicit
Dim strServer 

If WScript.Arguments.UnNamed.Length < 1 Then 
    CheckServerUpdateStatus "localhost"
Else
    For Each strServer in WScript.Arguments.UnNamed
        If strServer="-" Then 
            Do While Not WScript.StdIn.AtEndOfStream
                strServer = Trim(WScript.StdIn.ReadLine)
                If Len(strServer) > 0 Then CheckServerUpdateStatus strServer 
            Loop
        Else 
            CheckServerUpdateStatus strServer 
        End If
    Next 
End If
WScript.Quit(0)
选项显式
Dim服务器
如果WScript.Arguments.UnNamed.Length<1,则
CheckServerUpdateStatus“本地主机”
其他的
对于WScript.Arguments.UnNamed中的每个strServer
如果strServer=“-”则
不执行WScript.StdIn.AtEndOfStream
strServer=Trim(WScript.StdIn.ReadLine)
如果Len(strServer)>0,则选中ServerUpdateStatus strServer
环
其他的
CheckServerUpdateStatus strServer
如果结束
下一个
如果结束
WScript.Quit(0)

显然,您需要维护您的
CheckServerUpdateStatus
功能,此代码仅处理参数输入。

如果您试图为一组计算机获取挂起的windows update安装,您可以在Powershell中使用此功能:

$computers = gc text_file_of_computers.txt
ForEach ($computer in $computers) {
     ("-" * 30)+"`n" # Horizontal line

     Write-Host "Patches not yet installed for $($computer)" -f "Yellow"
     Get-Hotfix -co $computer| Where {$_.InstalledOn -eq $null}

     "`n"+("-" * 30) # Horizontal line
}
如您所见,我们只显示了
InstalledOn
$null
值的修补程序,这意味着它们尚未安装


@vasilisyrakis您能帮我一下吗?基本上,我正在寻找一个VBscript开关,在那里可以提供输入文件,而不是在命令提示符处键入所有服务器名称您是否已经将所有服务器名称都放在一个文本文件中了?我不太熟悉VBA,是的。我在文本文件中列出了大约50台服务器。如果脚本可以按照您的方式翻译为Powershell,那就没问题了,这是可行的。很高兴你回复了…嗨@MC ND,当我复制了上面的代码并把它放到我的脚本中时,但是这给了我错误。很抱歉,我对这个VBSCRIPT是完全陌生的,我不确定在我的脚本中输入这个代码是否需要任何代码更改才能工作。请指导我在脚本中的何处放置此代码,以便列表可以作为输入。Strserver字符串应该被替换,对吗?请指导我更正代码hi@MC-ND,这非常有效。谢谢你为指导我所做的努力。干杯嗨,瓦西
Option Explicit
Dim strServer 

If WScript.Arguments.UnNamed.Length < 1 Then 
    CheckServerUpdateStatus "localhost"
Else
    For Each strServer in WScript.Arguments.UnNamed
        If strServer="-" Then 
            Do While Not WScript.StdIn.AtEndOfStream
                strServer = Trim(WScript.StdIn.ReadLine)
                If Len(strServer) > 0 Then CheckServerUpdateStatus strServer 
            Loop
        Else 
            CheckServerUpdateStatus strServer 
        End If
    Next 
End If
WScript.Quit(0)
$computers = gc text_file_of_computers.txt
ForEach ($computer in $computers) {
     ("-" * 30)+"`n" # Horizontal line

     Write-Host "Patches not yet installed for $($computer)" -f "Yellow"
     Get-Hotfix -co $computer| Where {$_.InstalledOn -eq $null}

     "`n"+("-" * 30) # Horizontal line
}