Код:
@echo off
SET FileName=Updates4TargatePC
IF EXIST %FileName%.exe goto RunEXE
IF EXIST %FileName%.vb goto setNetVersion
REM Start VbCode
echo Imports System' >%FileName%.vb
echo Imports System.IO' >>%FileName%.vb
echo Imports System.Collections' >>%FileName%.vb
echo Imports Microsoft.VisualBasic' >>%FileName%.vb
echo ' >>%FileName%.vb
echo Class Updates4TargatePC 'Make a list with paths to Updates for targate PC' >>%FileName%.vb
echo Shared WinVer As String' >>%FileName%.vb
echo Shared Extention As String' >>%FileName%.vb
echo Shared Platform As String' >>%FileName%.vb
echo Shared Lang As String' >>%FileName%.vb
echo Shared KbList As New ArrayList()' >>%FileName%.vb
echo Shared KbListCounts As New ArrayList()' >>%FileName%.vb
echo ' >>%FileName%.vb
echo Shared Sub Main(ByVal CmdArgs() As String)' >>%FileName%.vb
echo If CmdArgs.Length ^< 1 Then' >>%FileName%.vb
echo Console.WriteLine(vbNewLine ^& "Use next (for example):" ^& vbNewLine ^& " ?:\<FolderWithUpdates>\ win2k|winxp|vista|win2k8|seven|win2k8r2|<Your Os Name> x86|x64 ENU|RUS|NEU ?:\File\Consist\Windows_Update\Raport.txt")' >>%FileName%.vb
echo Return' >>%FileName%.vb
echo End If' >>%FileName%.vb
echo 'Windows-KB913086-201004.iso ^>= 'Windows-KB913086-201003.iso ^<=' >>%FileName%.vb
echo If CmdArgs.Length ^> 1 Then' >>%FileName%.vb
echo Select Case CmdArgs(1)' >>%FileName%.vb
echo Case "win2k"' >>%FileName%.vb
echo WinVer = "Windows2000" '"WINDOWS2000"' >>%FileName%.vb
echo Case "winxp"' >>%FileName%.vb
echo WinVer = "WindowsXP" '"WINDOWSXP"' >>%FileName%.vb
echo Case "win2k3"' >>%FileName%.vb
echo WinVer = "WindowsServer2003" '"WINDOWSSERVER2003"' >>%FileName%.vb
echo Case "vista"' >>%FileName%.vb
echo WinVer = "WindowsVista" '"WINDOWSVISTA"' >>%FileName%.vb
echo Case "win2k8"' >>%FileName%.vb
echo WinVer = "WindowsServer2008" '"WINDOWSSERVER2008"' >>%FileName%.vb
echo Case "seven"' >>%FileName%.vb
echo WinVer = "Windows7" '"WINDOWS7"' >>%FileName%.vb
echo Case "win2k8r2"' >>%FileName%.vb
echo WinVer = "WindowsServer2008R2" '"WINDOWSSERVER2008R2"' >>%FileName%.vb
echo Case Else' >>%FileName%.vb
echo WinVer = CmdArgs(1)' >>%FileName%.vb
echo End Select' >>%FileName%.vb
echo If (CmdArgs(1) = "win2k" Or CmdArgs(1) = "winxp" Or CmdArgs(1) = "win2k3") Then' >>%FileName%.vb
echo Extention = ".EXE"' >>%FileName%.vb
echo Else 'vista win2k8 seven win2k8R2' >>%FileName%.vb
echo Extention = ".MSU"' >>%FileName%.vb
echo End If' >>%FileName%.vb
echo End If' >>%FileName%.vb
echo ' >>%FileName%.vb
echo If CmdArgs.Length ^> 2 Then' >>%FileName%.vb
echo Platform = CmdArgs(2) '"x86" '"X86"' >>%FileName%.vb
echo Else' >>%FileName%.vb
echo Platform = "x64"' >>%FileName%.vb
echo End If' >>%FileName%.vb
echo ' >>%FileName%.vb
echo If Extention ^<^> ".MSU" And CmdArgs.Length ^> 3 Then' >>%FileName%.vb
echo Lang = CmdArgs(3)' >>%FileName%.vb
echo ElseIf Extention = ".MSU" Then' >>%FileName%.vb
echo Lang = "NEU"' >>%FileName%.vb
echo ElseIf CmdArgs.Length ^< 4 Then' >>%FileName%.vb
echo Lang = "ENU"' >>%FileName%.vb
echo End If' >>%FileName%.vb
echo ' >>%FileName%.vb
echo If CmdArgs.Length ^> 4 Then' >>%FileName%.vb
echo ListFileWithKB(CmdArgs(4))' >>%FileName%.vb
echo End If' >>%FileName%.vb
echo DirFiles(CmdArgs(0))' >>%FileName%.vb
echo If CmdArgs.Length ^> 5 Then' >>%FileName%.vb
echo For i As Integer = 0 To Math.Min(KbList.Count, KbListCounts.Count) - 1' >>%FileName%.vb
echo If KbListCounts(i) = 0 Then Console.WriteLine("::Rem: KB{0} not found in current place with updates", KbList(i))' >>%FileName%.vb
echo Next i' >>%FileName%.vb
echo End If' >>%FileName%.vb
echo End Sub' >>%FileName%.vb
echo ' >>%FileName%.vb
echo Shared Sub DirFiles(ByVal FilePath As String)' >>%FileName%.vb
echo Dim di As New IO.DirectoryInfo(FilePath)' >>%FileName%.vb
echo ' >>%FileName%.vb
echo Dim files As IO.FileInfo() = di.GetFiles()' >>%FileName%.vb
echo For Each curFile As IO.FileInfo In files' >>%FileName%.vb
echo Dim FileFullName As String = curFile.FullName' >>%FileName%.vb
echo If WinVer = Nothing Then' >>%FileName%.vb
echo Console.WriteLine(FileFullName)' >>%FileName%.vb
echo ElseIf (InStr(FileFullName, WinVer) ^> 0 Or InStr(FileFullName, ToUp(WinVer)) ^> 0) And curFile.Extension = Extention And (InStr(FileFullName, Platform) ^> 0 Or InStr(FileFullName, ToUp(Platform)) ^> 0) And (InStr(FileFullName, Lang) ^> 0 Or InStr(FileFullName, ToUp(Lang)) ^> 0) Then' >>%FileName%.vb
echo If KbList.Count = 0 Then' >>%FileName%.vb
echo Console.WriteLine(FileFullName)' >>%FileName%.vb
echo Else' >>%FileName%.vb
echo For i As Integer = 0 To KbList.Count - 1' >>%FileName%.vb
echo If InStr(FileFullName, CType(KbList(i), String)) Then' >>%FileName%.vb
echo 'Console.WriteLine(KbList(i))' >>%FileName%.vb
echo Console.WriteLine(FileFullName)' >>%FileName%.vb
echo KbListCounts(i) += 1' >>%FileName%.vb
echo End If' >>%FileName%.vb
echo Next i' >>%FileName%.vb
echo End If' >>%FileName%.vb
echo End If' >>%FileName%.vb
echo Next' >>%FileName%.vb
echo ' >>%FileName%.vb
echo Dim directories As IO.DirectoryInfo() = di.GetDirectories()' >>%FileName%.vb
echo For Each curDir As IO.DirectoryInfo In directories' >>%FileName%.vb
echo DirFiles(curDir.FullName.ToString)' >>%FileName%.vb
echo Next' >>%FileName%.vb
echo End Sub' >>%FileName%.vb
echo ' >>%FileName%.vb
echo Shared Sub ListFileWithKB(ByVal FileWithKBList As String)' >>%FileName%.vb
echo If FileWithKBList = Nothing Then' >>%FileName%.vb
echo Return' >>%FileName%.vb
echo End If' >>%FileName%.vb
echo Dim r As IO.StreamReader = New IO.StreamReader(FileWithKBList, Text.Encoding.Default)' >>%FileName%.vb
echo Dim Buff() As Char = r.ReadToEnd' >>%FileName%.vb
echo r.Close()' >>%FileName%.vb
echo For i As Integer = 2 To Buff.Length - 1' >>%FileName%.vb
echo If (Buff(i - 2) = "K" And Buff(i - 1) = "B" And Buff(i) ^<^> " ") Then' >>%FileName%.vb
echo Dim KB_Update As String = vbNullString '= "KB"' >>%FileName%.vb
echo While Char.IsDigit(Buff(i)) And i ^< Buff.Length - 1' >>%FileName%.vb
echo KB_Update = KB_Update ^& Buff(i)' >>%FileName%.vb
echo i += 1' >>%FileName%.vb
echo End While' >>%FileName%.vb
echo If (KB_Update ^<^> Nothing) And Not (KbList.Contains(KB_Update)) Then' >>%FileName%.vb
echo 'Console.WriteLine(KB_Update)' >>%FileName%.vb
echo KbList.Add(KB_Update)' >>%FileName%.vb
echo KbListCounts.Add(0)' >>%FileName%.vb
echo End If' >>%FileName%.vb
echo End If' >>%FileName%.vb
echo Next i' >>%FileName%.vb
echo End Sub' >>%FileName%.vb
echo ' >>%FileName%.vb
echo Shared Function ToUp(ByVal str As String) As String' >>%FileName%.vb
echo Dim _str As String = Nothing' >>%FileName%.vb
echo For Each ch As Char In str' >>%FileName%.vb
echo _str = _str ^& Char.ToUpper(ch)' >>%FileName%.vb
echo Next ch' >>%FileName%.vb
echo Return _str' >>%FileName%.vb
echo End Function' >>%FileName%.vb
echo End Class' >>%FileName%.vb
echo ' >>%FileName%.vb
REM End VbCode
:setNetVersion
if exist %SYSTEMROOT%\Microsoft.NET\Framework\v4.0.30319\vbc.exe goto net40
if exist %SYSTEMROOT%\Microsoft.NET\Framework\v3.5\vbc.exe goto net35
if exist %SYSTEMROOT%\Microsoft.NET\Framework\v2.0.50727\vbc.exe goto net20
if exist %SYSTEMROOT%\Microsoft.NET\Framework\v1.1.4322\vbc.exe goto net11
if exist %SYSTEMROOT%\Microsoft.NET\Framework\v1.0.3705\vbc.exe goto net10
echo Error: .NET Framework 4.0, 3.5, 3.0, 2.0, 1.1 or 1.0 required.
echo.
goto end
:net10
set VBC_PATH=%SYSTEMROOT%\Microsoft.NET\Framework\v1.0.3705
goto compile
:net11
set VBC_PATH=%SYSTEMROOT%\Microsoft.NET\Framework\v1.1.4322
goto compile
:net20
set VBC_PATH=%SYSTEMROOT%\Microsoft.NET\Framework\v2.0.50727
goto compile
:net35
set VBC_PATH=%SYSTEMROOT%\Microsoft.NET\Framework\v3.5
goto compile
:net40
set VBC_PATH=%SYSTEMROOT%\Microsoft.NET\Framework\v4.0.30319
goto compile
:compile
%VBC_PATH%\vbc %FileName%.vb /target:exe
:RunEXE
%FileName%.exe
:end
В коде выше программа завёрнута в батник, и для её сборки данный код необходимо скопировать в блокнот, сохранить в файле с расширением .cmd или .bat, и запустить его на выполнение.
Через мгновение получится исполняющий файл, с которым можно работать в консоли следующим образом.
Код:
Updates4TargatePC.exe I: - пролистать все файлы, аналогично dir /s
Updates4TargatePC.exe win2k - платформа и язык не заданы - будет использоваться x64 ENU. Вот только в данном случаи ничего не будет найдено. Windows 2000 не выходил в х64 варианте. Справедливости ради вариант win2k8r2 x86, с явным указанием платформы x86, по аналогичной причине тоже ничего не найдёт.
Updates4TargatePC.exe I: winxp x86 - язык явно не задан, будет использоваться ENU
Updates4TargatePC.exe I: vista x86 NEU raport.txt - идёт выборка по списку Windows Update
Updates4TargatePC.exe I: seven x86 NEU raport.txt ? – где ? любой символ хоть тот же знак вопроса, будет предоставлен отчёт о ненайденных обновлениях
Сам файл raport.txt получается путём копирования содержимого страницы Windows Update (в win2k, winxp, win2k3), а в Висте и выше из окна Центра обновления
(как быть в Core версиях Win2k8(R2) не скажу. Да и .Net Frameworks, необходимого для работы программы, в Core может не быть.).
(копировать подробности -> сохранить в блокноте в файл -> указать путь к файлу четвёртым параметром Updates4TargatePC)
Все параметры, кроме первого (на не существование пути программа не проверяет) являются, опциональными. Однако выборка по списку будет работать только при указании всех параметров в чёткой последовательности:
- путь к папке с обновлениями
- префикс версии Виндовс (распознаются win2k|winxp|vista|win2k8|seven|win2k8r2 в нижних регистрах) или полностью имя папки с образа (например Windows7, WindowsEmbeddedStandard7 и т.д.)
- платформа (x86, x64, ia64)
- язык (для висты и выше данный параметр игнорируется, но если необходимо указать путь к файлу, параметр должен быть указан, например как NEU) для версий ранее Висты это может быть RUS, ENU и другой наличный в образе
- ну и конечно путь к файлу с рапортом
- последний параметр может быть абсолютно любым, если он указан будет сформирован список не найденных на образе обновлений
Образы нужно смонтировать отдельной программой
например DAEMON Tools Lite или WinCDEmu, в примерах выше точка монтирования диск I:
После получения путей их можно скопировать в батник, выделив их в консоли.
Можно также не выделяя ничего в консоли, а сразу получить файл с путями, если после последнего параметра указать
>"имя файла.bat". Перед запуском сформированного батника его необходимо подправить, добавить параметры файлам, для автоматизации установки обновлений:
- для win2k/winxp/win2k3 -u -q –norestart
- для vista/win2k8/seven/win2k8r2 /quiet /norestart
Будьте внимательны, на некоторых образах присутствуют обновления к IE. Убедитесь что оставляете путь именно к той версии IE, который есть в системе на данный момент.
Например в августовском образе для системы xp в обновлении KB2183461 доступно три версии: для IE6, IE7, IE8.
P.S.
Помимо рапорта Windows Update подойдёт любой список обновлений. Например тот, что размешён в шапках тем форума по наборам обновлений a.k.a PreSP, к разным системам.