Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Массовое определение контрольных сумм файлов

Ответить
Настройки темы
PowerShell - Массовое определение контрольных сумм файлов

Старожил


Сообщения: 184
Благодарности: 1

Профиль | Отправить PM | Цитировать


Добрый день! Хочу в папке Windows всем exe файлам определить контрольные суммы (в дальнейшем и не только в Windows). Через PowerShell:
Код: Выделить весь код
param (
    [string]$FolderPath,  # c:\windows
    [string]$LogFile = "c:\1\checksums.log" 
)
if (-Not (Test-Path $FolderPath))
{
    Write-Host "Путь не найден: $FolderPath"
    exit
}
$files = Get-ChildItem -Path $FolderPath -Recurse -Filter *.exe
$logFileStream = New-Object System.IO.StreamWriter($LogFile, $false)
foreach ($file in $files) {
    try {
        $hash = Get-FileHash -Path $file.FullName -Algorithm SHA256
        $logEntry = "{0} {1}" -f $hash.Hash, $file.FullName
        $logFileStream.WriteLine($logEntry)
        Write-Host "Контрольная сумма для $($file.FullName): $($hash.Hash)"
    } catch {
        Write-Host "Ошибка при обработке файла $($file.FullName): $_"
    }
}
$logFileStream.Close()
Write-Host "Результаты сохранены в $LogFile"
На windows 10 вроде как делает но выходит ошибка (которая не мешает проведению контроля целостности):

Цитата:
Test-Path : Не удается привязать аргумент к параметру "Path", так как он представляет собой пустую строку.
строка:1 знак:21
+ if (-Not (Test-Path $FolderPath))
+ ~~~~~~~~~~~
+ CategoryInfo : InvalidData: (Very Happy [Test-Path], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.Test
PathCommand
На 7 и XP пытается делать но результата ноль ошибка другого формата:
Цитата:
Test-Path : Не удается привязать аргумент к параметру "Path", так как он представляет собой пустую строку.
строка:5 знак:20
+ if (-Not (Test-Path <<<< $FolderPath))
+ CategoryInfo : InvalidData: (Very Happy [Test-Path], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.Test
PathCommand

Ошибка при обработке файла C:\windows\explorer.exe: Имя "Get-FileHash" не распознано как имя командлета, функции, файла
скрипта или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после че
го повторите попытку.
Ошибка при обработке файла C:\windows\hh.exe: Имя "Get-FileHash" не распознано как имя командлета, функции, файла скрипт
а или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего пов
торите попытку.
Подскажите, что подправить, что бы взлетело? Спасибо!

Отправлено: 13:19, 28-12-2024

 

Старожил


Сообщения: 184
Благодарности: 1

Профиль | Отправить PM | Цитировать


А там может путь к файлу прописать?

Отправлено: 19:08, 06-01-2025 | #31



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата alexdomovoi:
может путь к файлу прописать? »
можно и прописать... можно и рядом со скриптом его поискать... тут уж, чего больше душа пожелает...

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:42, 06-01-2025 | #32


Старожил


Сообщения: 184
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
можно и прописать... можно и рядом со скриптом его поискать... тут уж, чего больше душа пожелает... »
Да, спасибо с файлом разобрался, подскажите, а нельзя сюда применить из первого сообщения
Цитата:
$files = Get-ChildItem -Path $FolderPath -Recurse -Filter *.exe
что бы собирались данные по exe из всех подпапок тоже?
по хешу разному разобрался утилита certutil дает хеш тот который дает и скрипт, а вот почему 7zip дает другой при выборе SHA256 непонятно ну и ладно, у меня 7zip в системе нет.

Последний раз редактировалось alexdomovoi, 07-01-2025 в 04:42.


Отправлено: 04:37, 07-01-2025 | #33


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата alexdomovoi:
нельзя сюда применить из первого сообщения »
да, можно, конечно.

Цитата alexdomovoi:
что бы собирались данные по exe из всех подпапок тоже? »
на это влияет параметр -Recurse командлета Get-ChildItem, который в моем варианте также присутствует. Вы ведь можете увидеть, что в файле присутствуют пути к файлам из подкаталогов... то бишь, разницы никакой нет, ещё и экономия памяти в моем варианте...
Но если хочется, то проблем никаких нет:
Код: Выделить весь код
param (
    [string]$FolderPath,  # c:\windows
    [string]$LogFile = "c:\1\checksums.log" 
)
if (-Not (Test-Path $FolderPath))
{
    Write-Host "Путь не найден: $FolderPath"
    exit
}

function get-fhash($x){
    $hash = [security.cryptography.sha256]::create()
    $file = gi $x
    $stream = $file.openread()
    $strb = new-object Text.StringBuilder
    foreach($byte in $hash.computehash($stream)){
        $null = $strb.append($byte.tostring('x2'))
    }
    $stream.close()
    return $strb.tostring()
}

$files = dir $FolderPath -rec -filt "*.exe"

$files|%{
	new-object PSObject -Property @{Path = $_.fullname;SHA256 = get-fhash $_.fullname}
} |convertto-csv -notyp|out-file $LogFile -enc utf8

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:29, 07-01-2025 | #34


Старожил


Сообщения: 184
Благодарности: 1

Профиль | Отправить PM | Цитировать


Резюмирую:
Проверил на XP-7 PowerShell 2.0

Код: Выделить весь код
param (
    [string]$FolderPath,  # c:\windows
    [string]$LogFile = "c:\1\checksums.log" 
)
if (-Not (Test-Path $FolderPath))
{
    Write-Host "Путь не найден: $FolderPath"
    exit
}

function get-fhash($x){
    $hash = [security.cryptography.sha256]::create()
    $file = gi $x
    $stream = $file.openread()
    $strb = new-object Text.StringBuilder
    foreach($byte in $hash.computehash($stream)){
        $null = $strb.append($byte.tostring('x2'))
    }
    $stream.close()
    return $strb.tostring()
}

$files = dir $FolderPath -rec -filt "*.exe"

$files|%{
	new-object PSObject -Property @{Path = $_.fullname;SHA256 = get-fhash $_.fullname}
} |convertto-csv -notyp|out-file $LogFile -enc utf8
выдает ошибку
Цитата:
Test-Path : Не удается привязать аргумент к параметру "Path", так как он представляет собой пустую строку.
строка:5 знак:20
+ if (-Not (Test-Path <<<< $FolderPath))
+ CategoryInfo : InvalidData: ( [Test-Path], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.Test
PathCommand
но отрабатывает файлы exe вместе с подпапками.

вот этот вариант на XP-7 PowerShell 2.0:
Код: Выделить весь код
function get-fhash($x){
    $hash = [security.cryptography.sha256]::create()
    $file = gi $x
    $stream = $file.openread()
    $strb = new-object Text.StringBuilder
    foreach($byte in $hash.computehash($stream)){
        $null = $strb.append($byte.tostring('x2'))
    }
    $stream.close()
    return $strb.tostring()
}

dir $env:windir\system32\*.exe -rec|%{
	new-object PSObject -Property @{Path = $_.fullname;SHA256 = get-fhash $_.fullname}
} |convertto-csv -notyp |out-file c:\1\out.csv -enc utf8
отрабатывает без ошибки, но при этом отрабатывает exe только в одной папке в которой я запускаю данный скрипт без подпапок (windir\system32).

Отправлено: 10:46, 08-01-2025 | #35


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата alexdomovoi:
выдает ошибку »
Ну так надо дать ему то, чего скрипт хочет... путь к каталогу в виде параметра к скрипту... ну, или указать его здесь:
Цитата alexdomovoi:
[string]$FolderPath, # c:\windows »
например, так:
Код: Выделить весь код
param (
    [string]$FolderPath = "c:\windows",  # c:\windows
    [string]$LogFile = "c:\1\checksums.log" 
)
...
- если скрипт предполагаете запускать без параметров

Цитата alexdomovoi:
отрабатывает без ошибки, но при этом отрабатывает exe только в одной папке в которой я запускаю данный скрипт без подпапок (windir\system32). »
Этого просто не может быть... я его проверял на Win 7, где ps 2.0
Так он мог себя вести до того, как я его поправлял... если там в коде вызов функции был таким:
Код: Выделить весь код
...get-fhash $_}
а не как сейчас:
Код: Выделить весь код
...get-fhash $_.fullname}

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 08-01-2025 в 15:09.


Отправлено: 15:04, 08-01-2025 | #36


Старожил


Сообщения: 184
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: jpg powersh_6.JPG
(211.3 Kb, 2 просмотров)

Цитата YuS_2:
Этого просто не может быть... я его проверял на Win 7, где ps 2.0 »
скрин исполнения и результата прилагаю
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:39, 08-01-2025 | #37


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата alexdomovoi:
скрин исполнения и результата прилагаю »
А, да... точно. Не обратил внимания, что подкаталогов нет. Параметр Recurse претерпел изменения с версии PS 3.0, а для PS 2.0 было так:
Цитата:
Параметр Recurse работает только в том случае, если путь указывает на контейнер с дочерними элементами, на
пример "C:\Windows" или "C:\Windows\*", и не работает, если путь указывает на элементы без дочерних элемен
тов, например "C:\Windows\*.exe".
так что да, необходимо поменять было эту комбинацию. Вот это:
Код: Выделить весь код
dir $env:windir\system32\*.exe -rec
- надо поменять на это:
Код: Выделить весь код
dir $env:windir\system32 -rec -filt "*.exe"
Ну или использовать тот последний вариант скрипта, где путь к каталогу можно указывать в качестве параметра скрипта.

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:23, 08-01-2025 | #38



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Массовое определение контрольных сумм файлов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Массовое переименование файлов Super_Kolobok Скриптовые языки администрирования Windows 4 19-05-2024 16:28
Программы для сверки контрольных сумм KaSpieC 666 Хочу все знать 17 16-12-2014 18:39
CMD/BAT - Сравнение контрольных сумм md5 vodka Скриптовые языки администрирования Windows 11 09-01-2013 07:11
Прочие - Программы для подсчёта контрольных сумм файлов ALEXEY_DFD Программное обеспечение Windows 14 18-11-2011 15:30
C/C++ - Получение контрольных сумм файлов (MD5, и т.д.) и их проверка в Online-сервисах Drongo Программирование и базы данных 49 30-08-2010 18:39




 
Переход