Мой друг не нашёл решения на свой вопрос и обратился ко мне с просьбой - а как подсчитать суммарное количество знаков во множестве документов docx?
Мне показалась задача интересной и решил сваять PowerShell скрипт, который поможет реализовать задуманное. Не являюсь хейтером PowerShell и считаю его отличным инструментом для ИТ специалистов, тем более для админов и точно обязателен к изучению и освоению админами MS Windows платформ. По умолчанию в современных MS Windows уже доступен PowerShell, но по желанию новые версии Мощной Оболочки для различных операционных систем можно взять на сайте проекта https://aka.ms/powershell
В целях безопасности MS Windows по умолчанию не разрешает выполнение непонятных скриптов, что логично. Возможно, вам придётся однократно запустить оболочку с правами Администратора и выполнить Set-ExecutionPolicy RemoteSigned. Чтение zip архивов без распаковки system.io.compression.filesystem требует современных PowerShell и .Net Framework 4.5 или новее.
Общий алгоритм следующий:
1) Берём только docx файлы. Так как docx это формально zip архив с XML внутри. Doc - это закрытый бинарный формат, который не обрабатывается скриптом. Если вам необходимо обсчитать doc, то придётся или пересохранить их в docx или найти другое решение.
2) Читаем docx файл как "XML документ внутри ZIP архива без распаковки".
3) Убиваем все XML теги.
4) Подсчитываем длину оставшегося.
5) Суммируем в итоге и выдаём результат.
Сам скрипт можно скачать в архиве zip, чтобы браузеры не ругались при скачивании PowerShell скриптов ps1.
PowerShell script counts the number of characters in multiple docx files.
Add-Type -assembly "system.io.compression.filesystem"
Write-Host $PSScriptRoot
$overall_size = 0
Get-ChildItem -Path $PSScriptRoot -Recurse -Filter *.docx | Foreach-Object {
$zip = [io.compression.zipfile]::OpenRead($_.FullName)
$file = $zip.Entries | where-object { $_.Name -eq "document.xml"}
$stream = $file.Open()
$reader = New-Object IO.StreamReader($stream)
$text = $reader.ReadToEnd()
$text = $text -replace '<[^>]+>',''
Write-Host $_.FullName - $text.Length
$overall_size = $overall_size + $text.Length
$reader.Close()
$stream.Close()
$zip.Dispose()
}
Write-Host Total number of characters including spaces $overall_size
Write-Host "Press any key to continue ....."
[void][System.Console]::ReadKey($true)
Разместите скрипт CountChars.ps1 в каталоге с документами docx и правой клавишей вызовите контекстное меню где укажите запустить с помощью PowerShell. Скрипт будет обходить рекурсивно каталоги и все docx файлы будут обработаны.
Дата последней правки: 2022-05-14 08:32:17