Можно ли запустить CrystalDiskInfo из командной строки/PowerShell?

Вопрос или проблема

Я хочу иметь возможность запускать 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 предлагает простые опции для автоматического выполнения и сохранения отчётов. Основные команды включают:

  1. /Exit: Автоматический выход после обновления информации S.M.A.R.T. и состояния AAM/APM.
  2. /Copy: Вывод результата команды "Edit > Copy" в файл DiskInfo.txt.
  3. /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, обеспечивая более гибкий способ работы с информацией.

  1. Автоматизация: Используйте планировщик задач Windows для регулярного запуска сценария, обеспечивая бесперебойную работу мониторинга.

  2. Информационная безопасность: Разрешите доступ к отчетам только авторизованным пользователям, обеспечивая конфиденциальность данных о состоянии оборудования.

  3. Отчетность: Данные из отдельных файлов можно использовать для генерации отчетов об уровне здоровья дисков, что помогает в принятии решений относительно замены оборудования или другой профилактики.

В заключение, использование CrystalDiskInfo через командную строку/PowerShell — это мощный и ненавязчивый способ получить и проанализировать данные о состоянии жестких дисков, обеспечивая эффективность автоматизации процессов в больших и малых сетевых инфраструктурах.

Оцените материал
Добавить комментарий

Капча загружается...