Пакетный файл / скрипт для удаления нескольких непоследовательных строк из текстовых файлов - PullRequest
0 голосов
/ 04 декабря 2009

Я прочитал предложение, перечисленное здесь .

Решение для пакетного файла работает до тех пор, пока я не получу примерно 5 игнорирующих условные строки, а затем вывод начинает игнорировать очень большие разделы текстовых файлов, даже если это не так.

По сути, у меня есть куча разборов systeminfo для Windows (run> cmd> systeminfo). Если вы запустите утилиту системной информации, вы увидите там несколько строк (200+). Я хочу, чтобы они проходили через них (каталог за раз, надеюсь) и сохраняли или разбирали только те 10 строк, которые имеют значение (скорость процессора, объем оперативной памяти и т. Д.).

Как я уже сказал, я попробовал решение, описанное выше, и оно выглядело великолепно, пока я не преодолел несколько строк игнорирования, и внезапно он просто начал игнорировать почти все.

У кого-нибудь есть предложение? Или даже идея о том, что я делаю неправильно?

Это то, что я получил до того, как понял, что строки, которые не должны были быть удалены, не печатались,

type *.txt | findstr /v "OS Manufacturer:" | findstr /v "OS Configuration:" | findstr /v "OS Build Type:" | findstr /v "Product ID:" | findstr /v "Original Install Date:" | findstr /v "System Up Time:" | findstr /v "System type:" | findstr /v "BIOS Version:" | findstr /v "Windows Directory:" | findstr /v "System Directory:" | findstr /v "Boot Device:" | findstr /v "System Locale:" | findstr /v "Input Locale:" | findstr /v "Time Zone:" | findstr /v "Available Physical Memory:" | findstr /v "Virtual Memory: Max Size:" | findstr /v "Virtual Memory: Available:" | findstr /v "Virtual Memory: In Use:" | findstr /v "Page File Location(s):" | findstr /v "Domain:" | findstr /v "Logon Server:" | findstr /v "Hotfix(s):" | findstr /v "NetWork Card(s):" | findstr /v "Registered Owner:" | findstr /v "Registered Organization:"  > c:\zzz\final.txt

Ответы [ 4 ]

1 голос
/ 04 декабря 2009

Это сценарий, который я закончил. Я благодарю призрака, потому что он указал мне великое направление. Я тот, кто вообще не занимается сценариями, но я смог понять это.

Функция поста кода еще больше искажает этот испорченный беспорядок, но он работает.

On Error Resume Next
Set dtmConvertedDate = CreateObject("WbemScripting.SWbemDateTime")    
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")    
Set colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
Set colComputerSystems = objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
Const ForAppending = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
        For Each objComputerSystem in colComputerSystems
            dim txtfilename
            txtfilenamepc = objComputerSystem.Name
        dim longuser
        longuser = objComputerSystem.UserName
        dim myArray
        MyArray = Split(longuser,"\")
        dim shortuser
                if MyArray(2) = "" then shortuser = MyArray(1) else shortuser = MyArray(2)
    next
Set objTextFile = objFSO.OpenTextFile _
    ("\\hqfs01\TSUInstall\tools\damir\pcinfologs\" & shortuser & "-" & txtfilenamepc & ".txt", ForAppending, True)
For Each objComputerSystem in colComputerSystems

    objTextFile.WriteLine "User Name: " & shortuser
    objTextFile.WriteLine "Computer Name: " & objComputerSystem.Name
    objTextFile.WriteLine "Model: " & objComputerSystem.Model

    dim ramraw, ramdivider
    ramdivider = 1048576
    ramraw = objComputerSystem.TotalPhysicalMemory
    objTextFile.WriteLine "RAM: " & ramraw\ramdivider & " MB"
    Next
For Each objOperatingSystem in colOperatingSystems
    objTextFile.WriteLine "Operating System: " & objOperatingSystem.Caption
    objTextFile.WriteLine "Service Pack: " & objOperatingSystem.ServicePackMajorVersion
    Next
objTextFile.Close
0 голосов
/ 06 декабря 2009

Ваша проблема в том, что findstr обрабатывает пробелы в строке поиска немного по-другому:

Используйте пробелы для разделения множественного поиска строки, если аргумент с префиксом /C. Например, 'FINDSTR "hello there" x.y' поисков для "hello" или "there" в файле x.y. 'FINDSTR /C:"hello there" x.y' ищет "hello there" в файле x.y.

Таким образом, ваша длинная цепочка findstr s будет игнорировать каждую строку, содержащую хотя бы одну работу из любой строки поиска. Вы можете добавить строку поиска к /C, чтобы избежать этого:

type *.txt | findstr /v /c:"OS Manufacturer:" | findstr /v /c:"OS Configuration:" | ...

Также проблема в том, что строки поиска могут появляться в любом месте строки с приведенным выше синтаксисом. Вы можете привязать их к началу строки, используя регулярные выражения:

type *.txt | findstr /r /v /c:"^OS Manufacturer:" | findstr /r /v /c:"^OS Configuration:" | ...

^ действует как якорь и указывает findstr соответствовать этому только в начале строки. Но при использовании регулярных выражений вы должны экранировать некоторые символы, такие как точка.

0 голосов
/ 04 декабря 2009

пожалуйста, получите подходящий инструмент для разбора текста.если вы можете позволить себе использовать такие инструменты, как gawk (для windows), вот как вы можете это сделать, ЛЕГКО.

C:\test>systeminfo | gawk -F":" "/BIOS|Processor|<things i want>/{print $2}"

или если вы не можете позволить себе загружать файлы, M $ предоставил нам vbscript,что намного лучше, чем партия для таких вещей.Вот пример, а не исчерпывающее решение

Set dtmConvertedDate = CreateObject("WbemScripting.SWbemDateTime")    
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")    
Set colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
    Wscript.Echo "Boot Device: " & objOperatingSystem.BootDevice
    Wscript.Echo "Build Number: " & objOperatingSystem.BuildNumber
    Wscript.Echo "Build Type: " & objOperatingSystem.BuildType
    Wscript.Echo "Caption: " & objOperatingSystem.Caption
    Wscript.Echo "Code Set: " & objOperatingSystem.CodeSet
    Wscript.Echo "Country Code: " & objOperatingSystem.CountryCode
    Wscript.Echo "Debug: " & objOperatingSystem.Debug
    Wscript.Echo "Install Date: " & dtmInstallDate 
    Wscript.Echo "Licensed Users: " & objOperatingSystem.NumberOfLicensedUsers
    Wscript.Echo "Organization: " & objOperatingSystem.Organization
    Wscript.Echo "OS Language: " & objOperatingSystem.OSLanguage
    Wscript.Echo "OS Product Suite: " & objOperatingSystem.OSProductSuite
    Wscript.Echo "OS Type: " & objOperatingSystem.OSType
    Wscript.Echo "Primary: " & objOperatingSystem.Primary
    Wscript.Echo "Registered User: " & objOperatingSystem.RegisteredUser
    Wscript.Echo "Serial Number: " & objOperatingSystem.SerialNumber
    Wscript.Echo "Version: " & objOperatingSystem.Version
Next

Другие, которые вы можете использовать, например, для получения информации о биосе: Win32_Bios, Win32_PhysicalMemory, Win32_PhysicalMemoryArray для информации о памяти и т. Д.Изучите в MSDN vbscript или в простом Google различные WMI, которые вы можете использовать для получения информации об оборудовании компьютера.

0 голосов
/ 04 декабря 2009

Скорее всего, ваша проблема в том, что ваша командная строка слишком длинная. Попробуйте разбить фильтрацию на несколько частей с промежуточными файлами между ними.

...