Вопрос или проблема
Я хочу иметь возможность запускать CrystalDiskInfo из командной строки, чтобы сохранять и анализировать данные. Я хочу сделать это так, чтобы можно было автоматически запускать CrystalDiskInfo на удаленном устройстве и отправлять команды на основе вывода данных. Также хочу сделать это так, чтобы это не мешало пользователю, который в данный момент использует компьютер. (То есть, CrystalDiskInfo не должен просто открываться случайным образом и начинать работать, а окно должно быть скрыто от пользователя).
Я знаю, что существуют следующие команды:
Параметры командной строки
/Exit: Автоматическое завершение после обновления информации S.M.A.R.T и статуса AAM/APM
/Copy:
Вывод результата “Изменить > Копировать” в DiskInfo.txt
/CopyExit:
Вывод результата “Изменить > Копировать” в DiskInfo.txt и автоматическое завершение
но я не знаю, как их использовать.
На случай, если кому-то это будет полезно. Я сделал скрипт на PowerShell для разбора некоторой информации для собственного использования:
$cdiskinfo="C:\Program Files\CrystalDiskInfo"
& "$cdiskinfo\DiskInfo64.exe" /CopyExit
$s=gc "$cdiskinfo\DiskInfo.txt"
$models=($s | select-string " Model : ") -replace " Model : ",""
$firmwares=($s | select-string " Firmware : ") -replace " Firmware : ",""
$healths=($s | Select-String " Health Status : ") -replace " Health Status : ",""
$dletters=($s | Select-String " Drive Letter : ") -replace " Drive Letter : ",""
$temps=($s | Select-String " Temperature : ") -replace " Temperature : ",""
$feats=($s | Select-String " Features : ") -replace " Features : ",""
$Drives=`
for ($i=0;$i -lt $models.count;$i++) {
[PSCustomObject]@{"Model"=$models[$i];"Firmware"=$firmwares[$i];"Health"=$healths[$i];"Letter"=$dletters[$i];"Temp"=$temps[$i];"Features"=$feats[$i]}
}
$Drives
этот скрипт выше очень полезен!
есть ли возможность разделить отчет на отдельные файлы для каждого ДИСКА (имя файла = серийный номер). Я пробовал это, но не смог разделить файл (теперь каждый файл содержит ВСЕ значения CDi всех дисков (кроме того, блок с номерами удивительно публикуется дважды)).
спасибо за помощь 🙂
# Определение пути для отчета
$ReportPath = "C:\share\_run\CDi CLi\reports"
# Создание директории для отчетов, если она не существует
if (-not (Test-Path $ReportPath)) {
New-Item -Path $ReportPath -ItemType Directory -Force | Out-Null
}
# Путь и выполнение CrystalDiskInfo
$cdiskinfo="C:\Program Files\CrystalDiskInfo"
& "$cdiskinfo\DiskInfo64.exe" /CopyExit
$s=gc "$cdiskinfo\DiskInfo.txt"
# Извлечение серийных номеров для создания папок
$serialMatches = $s | Select-String " Serial Number : (.+)$"
$serials = $serialMatches | ForEach-Object { $_.Matches.Groups[1].Value.Trim() }
# Получение текущей метки времени
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
# Получение заголовочной информации (всё до первых данных по диску)
$headerContent = [System.Collections.ArrayList]@()
$foundFirstDrive = $false
foreach ($line in $s) {
if ($line -match "^-{20,} \(\d+\) ") {
$foundFirstDrive = $true
break
}
$headerContent.Add($line) | Out-Null
}
# Обработка вывода для каждого диска
$currentSerial = $null
$currentContent = [System.Collections.ArrayList]@()
$isFirstDrive = $true
foreach ($line in $s) {
# Проверка, является ли это новым разделом диска
if ($line -match "^-{20,}$" -or $line -match "^-{20,} \(\d+\) ") {
# Если мы собрали данные по диску, сохранить их
if ($currentSerial -and $currentContent.Count -gt 0) {
# Создание папки для диска
$driveFolder = Join-Path -Path $ReportPath -ChildPath $currentSerial
if (-not (Test-Path $driveFolder)) {
New-Item -Path $driveFolder -ItemType Directory -Force | Out-Null
}
# Сохранение содержимого с заголовком
$fileName = "CDi CLi - $currentSerial.txt"
$filePath = Join-Path -Path $driveFolder -ChildPath $fileName
# Добавление разделителя метки времени, если файл существует
if (Test-Path $filePath) {
"`n`n===========================================================" | Out-File -FilePath $filePath -Encoding UTF8 -Append
"Дата отчета: $timestamp" | Out-File -FilePath $filePath -Encoding UTF8 -Append
"===========================================================`n" | Out-File -FilePath $filePath -Encoding UTF8 -Append
}
# Объединение заголовка и содержимого диска
$fullContent = [System.Collections.ArrayList]@()
$headerContent | ForEach-Object { $fullContent.Add($_) | Out-Null }
$currentContent | ForEach-Object { $fullContent.Add($_) | Out-Null }
# Запись или добавление в файл
if (Test-Path $filePath) {
$fullContent | Out-File -FilePath $filePath -Encoding UTF8 -Append
} else {
$fullContent | Out-File -FilePath $filePath -Encoding UTF8
}
}
# Сброс для следующего диска
$currentContent = [System.Collections.ArrayList]@()
$currentSerial = $null
}
# Добавление строки в текущее содержимое
$currentContent.Add($line) | Out-Null
# Проверка, содержит ли строка серийный номер
if ($line -match " Serial Number : (.+)$") {
$currentSerial = $matches[1].Trim()
}
}
# Сохранение последнего содержимого диска, если существует
if ($currentSerial -and $currentContent.Count -gt 0) {
$driveFolder = Join-Path -Path $ReportPath -ChildPath $currentSerial
if (-not (Test-Path $driveFolder)) {
New-Item -Path $driveFolder -ItemType Directory -Force | Out-Null
}
$fileName = "CDi CLi - $currentSerial.txt"
$filePath = Join-Path -Path $driveFolder -ChildPath $fileName
# Добавление разделителя метки времени, если файл существует
if (Test-Path $filePath) {
"`n`n===========================================================" | Out-File -FilePath $filePath -Encoding UTF8 -Append
"Дата отчета: $timestamp" | Out-File -FilePath $filePath -Encoding UTF8 -Append
"===========================================================`n" | Out-File -FilePath $filePath -Encoding UTF8 -Append
}
# Объединение заголовка и содержимого диска
$fullContent = [System.Collections.ArrayList]@()
$headerContent | ForEach-Object { $fullContent.Add($_) | Out-Null }
$currentContent | ForEach-Object { $fullContent.Add($_) | Out-Null }
# Запись или добавление в файл
if (Test-Path $filePath) {
$fullContent | Out-File -FilePath $filePath -Encoding UTF8 -Append
} else {
$fullContent | Out-File -FilePath $filePath -Encoding UTF8
}
}
# Извлечение основной информации для отображения
$models=($s | select-string " Model : (.+)$" | ForEach-Object { $_.Matches.Groups[1].Value.Trim() })
$firmwares=($s | select-string " Firmware : (.+)$" | ForEach-Object { $_.Matches.Groups[1].Value.Trim() })
$healths=($s | Select-String " Health Status : (.+)$" | ForEach-Object { $_.Matches.Groups[1].Value.Trim() })
$dletters=($s | Select-String " Drive Letter : (.+)$" | ForEach-Object { $_.Matches.Groups[1].Value.Trim() })
$temps=($s | Select-String " Temperature : (.+)$" | ForEach-Object { $_.Matches.Groups[1].Value.Trim() })
$feats=($s | Select-String " Features : (.+)$" | ForEach-Object { $_.Matches.Groups[1].Value.Trim() })
# Создание и отображение объектов дисков
$Drives = for ($i=0;$i -lt $models.count;$i++) {
[PSCustomObject]@{
"Model"=$models[$i]
"Firmware"=$firmwares[$i]
"Health"=$healths[$i]
"Letter"=$dletters[$i]
"Temp"=$temps[$i]
"Features"=$feats[$i]
"Serial"=$serials[$i]
}
}
# Отображение информации о дисках в консоли
$Drives
Ответ или решение
Управление и мониторинг состояния жестких дисков — важная задача для администраторов и IT-экспертов, особенно если необходимо автоматизировать процесс мониторинга удалённо. CrystalDiskInfo — это полезный инструмент для контроля состояния жестких дисков через отчеты S.M.A.R.T (Self-Monitoring, Analysis and Reporting Technology), который можно использовать в сценариях автоматизации через командную строку или PowerShell. Давайте разберём, как эффективно использовать CrystalDiskInfo для выполнения удалённого мониторинга без ненужного вмешательства в работу пользователя.
Теория
CrystalDiskInfo предлагает простые опции для автоматического выполнения и сохранения отчётов. Основные команды включают:
/Exit
: Автоматический выход после обновления информации S.M.A.R.T. и состояния AAM/APM./Copy
: Вывод результата команды "Edit > Copy" в файл DiskInfo.txt./CopyExit
: Комбинация двух предыдущих команд: сохранение в файл и автоматический выход.
Эти команды позволяют вам получить данные о состоянии дисков без открытия графического интерфейса программы, что минимизирует вмешательство в работу пользователя.
Пример
Допустим, у вас есть задача регулярно собирать данные S.M.A.R.T. для анализа состояния дисков на нескольких устройствах и сохранять эти данные для последующего анализа. Вы хотите, чтобы процесс был безболезненным для пользователя и включал детализацию по каждому диску отдельно.
Вот пример сценария PowerShell, который делает именно это:
# Установка пути для CrystalDiskInfo
$cdiskinfo="C:\Program Files\CrystalDiskInfo"
# Выполнение CrystalDiskInfo с параметром /CopyExit
& "$cdiskinfo\DiskInfo64.exe" /CopyExit
# Чтение данных из сгенерированного файла
$s = Get-Content "$cdiskinfo\DiskInfo.txt"
# Извлечение данных по серийным номерам и другим характеристикам
$serials = ($s | Select-String " Serial Number : (.+)$").Matches.Groups[1].Value.Trim()
foreach ($serial in $serials) {
# Для каждого диска создаётся отдельный файл отчёта
$driveReport = $s | Select-String -Pattern "{0}" -replace "PLACEHOLDER", $serial
$driveReport | Out-File -FilePath "C:\Reports\{0}.txt" -f $serial -Encoding UTF8
}
# Вывод отформатированной информации для каждого диска
$models = ($s | Select-String " Model : ") -replace " Model : ", ""
$firmwares= ($s | Select-String " Firmware : ") -replace " Firmware : ", ""
$healths= ($s | Select-String " Health Status : ") -replace " Health Status : ", ""
$Drives = for ($i = 0; $i -lt $models.count; $i++) {
[PSCustomObject]@{
"Model"=$models[$i]
"Firmware"=$firmwares[$i]
"Health"=$healths[$i]
"Serial"=$serials[$i]
}
}
$Drives
Применение
Этот сценарий позволяет извлекать и сохранять информацию о каждом диске в отдельные файлы, поэтому данные легко анализировать. Также PowerShell позволяет использовать регулярные выражения, чтобы парсить текстовые отчеты, полученные от CrystalDiskInfo, обеспечивая более гибкий способ работы с информацией.
-
Автоматизация: Используйте планировщик задач Windows для регулярного запуска сценария, обеспечивая бесперебойную работу мониторинга.
-
Информационная безопасность: Разрешите доступ к отчетам только авторизованным пользователям, обеспечивая конфиденциальность данных о состоянии оборудования.
-
Отчетность: Данные из отдельных файлов можно использовать для генерации отчетов об уровне здоровья дисков, что помогает в принятии решений относительно замены оборудования или другой профилактики.
В заключение, использование CrystalDiskInfo через командную строку/PowerShell — это мощный и ненавязчивый способ получить и проанализировать данные о состоянии жестких дисков, обеспечивая эффективность автоматизации процессов в больших и малых сетевых инфраструктурах.