PDA

Показать полную графическую версию : [решено] Реализация grep средствами powershell


nwss
13-01-2023, 14:51
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
в 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

желаемый вывод »
$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
Нет Криптопро под рукой, поэтому исходником выступает текст.

$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
$ContainerDate у вас булев тип, поэтому сравнение дат не будет работать. Найденная подстрока лежит в $matches[0] (https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_regular_expressions?view=powershell-7.3#groups-captures-and-substitutions)
Причём надо проверять $ContainerDate на $true иначе уходить на следующую итерацию с continue, иначе в случае несовпадения будет проверяться последнее совпавшее.

Serguei Kouzmine
13-01-2023, 18:27
еще для этого есть select-string
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-string?view=powershell-7.2
вызывается так

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

nwss
17-01-2023, 16:31
Столько костылей, только бы не использовать современные командные оболочки... (http://forum.oszone.net/post-2986067.html#post2986067)

Мой ответ Могарычу спустя пол года :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
Отлично! Если освоите Custom Objects (https://learn.microsoft.com/ru-ru/powershell/scripting/learn/deep-dives/everything-about-pscustomobject?view=powershell-7.3), будет чудесно.

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

nwss
17-01-2023, 17:11
Отлично! Если освоите Custom Objects, будет чудесно.

https://www.google.com/search?q=powe...+Custom+Object
Это как-то помогло бы мне решить данную задачу более элегантно?

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

nwss
17-01-2023, 17:25
Тогда встретимся через пол года :yes:

YuS_2
17-01-2023, 18:15
nwss, вот, совсем другое дело :)
Только небольшое уточнение:
# Для powershell ise нужна смена кодировки »
powershell ise совсем не нужен, то бишь умер он и не надо тревожить "мертвецов"... :)

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

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




© OSzone.net 2001-2012