Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Реализация grep средствами powershell (http://forum.oszone.net/showthread.php?t=352787)

nwss 13-01-2023 14:51 3000883

Реализация grep средствами powershell
 
У меня есть вот такой вывод одной утилиты

CSP (Type:80) v5.0.10003 KC3 Release Ver:5.0.11455 OS:Windows CPU:AMD64 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 9023212
GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider
Container name: "Михеева Ольга Алупьевна 1114443106"
Signature key is not available.
Exchange key is available. HCRYPTKEY: 0x8b7999
Symmetric key is not available.
UEC key is not available.
Keys in container:
exchange key
Extensions:
OID: 1.2.643.2.2.37.3.10
PrivKey: Not specified - 14.02.2023 13:31:19 (UTC)

OID: 1.2.643.2.2.37.3.1
Certificates: 1:
DName: E=uc_fk@roskazna.ru, S=г. Москва, INN=007710568760, OGRN=1047797019830, STREET="Большой Златоустински
й переулок, д. 6, строение 1", L=Москва, C=RU, O=Федеральное казначейство, CN=Федеральное казначейство

OID: 1.2.643.2.2.37.3.3
Certificates: 1:
DName: E=dit@minsvyaz.ru, C=RU, S=77 Москва, L=г. Москва, STREET="улица Тверская, дом 7", O=Минкомсвязь Росс
ии, OGRN=1047702026701, INN=007710474375, CN=Минкомсвязь России
Total: SYS: 0,000 sec USR: 0,000 sec UTC: 0,029 sec
[ErrorCode: 0x00000000]


из которого мне нужно достать дату чтобы сравнить ее с текущей
прибегая к сторонним утилитам я юзал grep где это решалось строкой: grep -Eo "[0-9]{2}\.[0-9]{2}\.[0-9]{4}"
в powershell мне не хватает ключа -o чтобы выдернуть только ту часть строки, которая соответствует паттерну
как это сделать?

вот мой код
Код:

chcp 65001
$CSPTest = "C:\Program Files (x86)\Crypto Pro\CSP\csptest.exe"
$Conts = . $CSPTest -keys -enum -verifyco
$OnlyContainers = $Conts | Select-Object -SkipLast 3 | Select-Object -Skip 2
$CurrentDate = get-date -Format 'dd.MM.yyyy HH:mm:ss'
foreach($Container in $OnlyContainers){
    $ContInfo = . $CSPTest -keyset -container $Container
    $ContainerDate = $ContInfo -match '[0-9]{1,2}\.[0-9]{2}\.[0-9]{4}'
    Write-Host $Container
    if ($CurrentDate -ge $ContainerDate){
        #. $CSPTest -keys -enum -verifyco -deletek -pattern $Container
        Write-Host -ForegroundColor Green $ContainerDate -NoNewline
    } else {
        Write-Host -ForegroundColor Red $ContainerDate -NoNewline
    }
    Write-Host " : " -NoNewline
    Write-Host -ForegroundColor Yellow $CurrentDate
}




вывод

Абрамова Юлия Ивановна 314122617
PrivKey: Not specified - 13.06.2023 14:57:04 (UTC) : 13.01.2023 14:32:54
ДЕНИНА ЛУЛУМБА ВАСИЛЬЕВНА 1213244259
PrivKey: Not specified - 19.03.2024 17:43:38 (UTC) : 13.01.2023 14:32:54
Астахова Марина Сергеевна 1114442618
PrivKey: Not specified - 14.02.2023 13:26:51 (UTC) : 13.01.2023 14:32:54
Данилова Хрыстина Викторовна 1114443106
PrivKey: Not specified - 14.02.2023 13:31:19 (UTC) : 13.01.2023 14:32:54

желаемый вывод

Абрамова Юлия Ивановна 314122617
13.06.2023 14:57:04 : 13.01.2023 14:32:54
ДЕНИНА ЛУЛУМБА ВАСИЛЬЕВНА 1213244259
19.03.2024 17:43:38 : 13.01.2023 14:32:54
Астахова Марина Сергеевна 1114442618
14.02.2023 13:26:51 : 13.01.2023 14:32:54
Данилова Хрыстина Викторовна 1114443106
14.02.2023 13:31:19 : 13.01.2023 14:32:54


Заранее спасибо

YuS_2 13-01-2023 15:19 3000884

Цитата:

Цитата nwss
в powershell мне не хватает ключа -o чтобы выдернуть только ту часть строки, которая соответствует паттерну »

Код:

$text = @"
Абрамова Юлия Ивановна 314115617
PrivKey: Not specified - 13.06.2023 14:57:04 (UTC) : 13.01.2023 14:32:54
ДЕНИНА ЛУЛУМБА ВАСИЛЬЕВНА 1219144259
PrivKey: Not specified - 19.03.2024 17:43:38 (UTC) : 13.01.2023 14:32:54
Астахова Марина Сергеевна 1115102618
PrivKey: Not specified - 14.02.2023 13:26:51 (UTC) : 13.01.2023 14:32:54
Данилова Хрыстина Викторовна 1115103106
PrivKey: Not specified - 14.02.2023 13:31:19 (UTC) : 13.01.2023 14:32:54
"@

$pattern = "[0-9]{2}\.[0-9]{2}\.[0-9]{4}"

(sls -inp $text -patt $pattern -all).matches.value

Цитата:

Цитата nwss
желаемый вывод »

Код:

$text = @"
Абрамова Юлия Ивановна 314115617
PrivKey: Not specified - 13.06.2023 14:57:04 (UTC) : 13.01.2023 14:32:54
ДЕНИНА ЛУЛУМБА ВАСИЛЬЕВНА 1219144259
PrivKey: Not specified - 19.03.2024 17:43:38 (UTC) : 13.01.2023 14:32:54
Астахова Марина Сергеевна 1115102618
PrivKey: Not specified - 14.02.2023 13:26:51 (UTC) : 13.01.2023 14:32:54
Данилова Хрыстина Викторовна 1115103106
PrivKey: Not specified - 14.02.2023 13:31:19 (UTC) : 13.01.2023 14:32:54
"@

$pattern = "[0-9]{2}\.[0-9]{2}\.[0-9]{4}"

$text -split "`n"|%{
        $_ -replace "^privkey.*?(?=$pattern)" -replace "\s\(utc\)"
}


DJ Mogarych 13-01-2023 15:22 3000885

Нет Криптопро под рукой, поэтому исходником выступает текст.
Код:

$t = get-date
$source = gc "D:\temp\1.txt"
$timeStamp = ($source |sls -pattern '^PrivKey:') -replace '.+(\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2}).+','$1' -as [datetime]

($timeStamp - $t).days

31


Sham 13-01-2023 16:41 3000887

$ContainerDate у вас булев тип, поэтому сравнение дат не будет работать. Найденная подстрока лежит в $matches[0]
Причём надо проверять $ContainerDate на $true иначе уходить на следующую итерацию с continue, иначе в случае несовпадения будет проверяться последнее совпавшее.

Serguei Kouzmine 13-01-2023 18:27 3000898

еще для этого есть select-string
https://learn.microsoft.com/en-us/po...powershell-7.2
вызывается так

write-output $command_output | Select-String $fragment -Context $before,$after

nwss 17-01-2023 16:31 3001142

Мой ответ Могарычу спустя пол года :laugh:

Готовый рабочий и безопасный скрипт удаления старых контейнеров
Код:

# Для powershell ise нужна смена кодировки
#chcp 65001
if ([Environment]::Is64BitOperatingSystem){
    $CSPTest = "C:\Program Files (x86)\Crypto Pro\CSP\csptest.exe"
} else {
    $CSPTest = "C:\Program Files\Crypto Pro\CSP\csptest.exe"
}
$RegExpPattern = "[0-9]{2}\.[0-9]{2}\.[0-9]{4} [0-9]{2}\:[0-9]{2}\:[0-9]{2}"
$Conts = . $CSPTest -keys -enum -verifyco
$OnlyContainers = $Conts | Select-Object -SkipLast 3 | Select-Object -Skip 2
$CurrentDate = (get-date -Format 'dd.MM.yyyy HH:mm:ss') -as [DateTime]
foreach($Container in $OnlyContainers){
    $ContInfo = . $CSPTest -keyset -container $Container
    $ContainerDate = (Select-String -InputObject $ContInfo -Pattern $RegExpPattern).matches.value -as [DateTime]
    if (-Not($ContainerDate -eq $null)){
        Write-Host 'Контейнер: ' -NoNewline
        Write-Host $Container -ForegroundColor Cyan
        Write-Host 'Действителен до: ' -NoNewline
        Write-Host -ForegroundColor Yellow $ContainerDate -NoNewline
        $DateDifference = $ContainerDate - $CurrentDate
        $LongStr = " (Осталось $($DateDifference.Days) дней $($DateDifference.Hours) часов $($DateDifference.Minutes) минут)"
        if ($CurrentDate -ge $ContainerDate){
            Write-Host $LongStr + '- Удаляем' -ForegroundColor Red
            . $CSPTest -keys -enum -verifyco -deletek -pattern $Container > $null
        } else {
            Write-Host $LongStr -ForegroundColor Green
        }
    } else {
        Write-Host 'Контейнер: ' -NoNewline
        Write-Host $Container -ForegroundColor Cyan
        Write-Host 'Без сертификата' -ForegroundColor Magenta
    }
}


DJ Mogarych 17-01-2023 16:43 3001144

Отлично! Если освоите Custom Objects, будет чудесно.

https://www.google.com/search?q=powe...+Custom+Object

nwss 17-01-2023 17:11 3001147

Цитата:

Цитата DJ Mogarych
Отлично! Если освоите Custom Objects, будет чудесно.

https://www.google.com/search?q=powe...+Custom+Object

Это как-то помогло бы мне решить данную задачу более элегантно?

DJ Mogarych 17-01-2023 17:20 3001148

Полагаю, да, и в будущем очень пригодится.
Можно делать более наглядное и удобное представление данных (таблицы, например), которые потом, например, легко конвертируются в html-отчёты, Excel-документы и прочее.

nwss 17-01-2023 17:25 3001150

Тогда встретимся через пол года :yes:

YuS_2 17-01-2023 18:15 3001157

nwss, вот, совсем другое дело :)
Только небольшое уточнение:
Цитата:

Цитата nwss
# Для powershell ise нужна смена кодировки »

powershell ise совсем не нужен, то бишь умер он и не надо тревожить "мертвецов"... :)

Лучше завести для себя правило: сохранять скрипты в кодировке utf8 with BOM, для уменьшения проблем с кодировками в дальнейшем...

Цитата:

Цитата nwss
Тогда встретимся через пол года »

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


Время: 09:37.

Время: 09:37.
© OSzone.net 2001-