Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   CMD/BAT Пакетное подписание word документов (http://forum.oszone.net/showthread.php?t=355336)

titanich 31-05-2024 19:22 3027773

CMD/BAT Пакетное подписание word документов
 
Здравствуйте. Прошу вашей помощи с доработкой скрипта. Нужно сохранить большое количество word документов в формат pdf и подписать их электронной подписью с сохранением структуры каталогов.
Мой скрипт пересохраняет и подписывает файлы, но слаживает все подписанные файлы в один каталог, а нужно сохранить структуру каталогов
Код:


@chcp 1251
rem @echo off
set "proga=c:\Program Files\PDF24\pdf24-DocTool.exe"
set "dir_in=d:\input"
set "dir_out=d:\out"
 
if not exist "%dir_out%" md "%dir_out%"
for /f "delims=" %%a in ('dir /a-d/b/s "%dir_in%\*.docx"') do "%proga%" -applyProfile -profile "default/good" -outputDir "%dir_in%" -convertToPDF "%%a"
for /f "delims=" %%a in ('dir /a-d/b/s "%dir_in%\*.doc"') do "%proga%" -applyProfile -profile "default/good" -outputDir "%dir_in%" -convertToPDF "%%a"
for /f "delims=" %%a in ('dir /a-d/b/s "%dir_in%\*.xlsx"') do "%proga%" -applyProfile -profile "default/good" -outputDir "%dir_in%" -convertToPDF "%%a"
for /f "delims=" %%a in ('dir /a-d/b/s "%dir_in%\*.pdf"') do (
"%proga%" -profile "default/good" -outputDir "%dir_out%" -join "%%a" "f:\distributives\пакетное подписание файлов\Подпись.pdf"
move /y "%dir_out%\*.*" "%%a"
if exist "%dir_out%\input.pdf" del /f /q "%dir_out%\input.pdf"
)
"c:\Program Files (x86)\Crypto Pro\PDF\cppdfutil.exe" sign -i "%dir_in%" -o "%dir_out%" -c "f:\distributives\пакетное подписание файлов\Сертификат.cer"
rem rd /s /q "%dir_in%"
rem md "%dir_in%"
copy "f:\distributives\пакетное подписание файлов\bat.bat.lnk" "%dir_in%\bat.bat.lnk"

ПС: в конце кода строчки это я не могу решить вопрос с очисткой входного каталога от файлов из прошлого задания

DJ Mogarych 02-06-2024 07:14 3027798

Можно так попробовать (Powershell). Не проверял, поэтому могут быть ошибки.
Также, я не знаю, умеет ли cppdfutil.exe обрабатывать каталог рекурсивно, поэтому предположил, что нет.

Код:

$dir_in = "d:\input"
$dir_out = "d:\out"
$proga = "c:\Program Files\PDF24\pdf24-DocTool.exe"
$cppdfutil = "c:\Program Files (x86)\Crypto Pro\PDF\cppdfutil.exe"
$sign = "f:\distributives\пакетное подписание файлов\Подпись.pdf"
$cert = "f:\distributives\пакетное подписание файлов\Сертификат.cer"


$files = dir $dir_in -Recurse -Include "*.doc*","*.xls*"

# Создание структуры каталогов в конечном и временных каталогах
$dir_in_regex = $dir_in -replace '\\','\\'
$dir_pdfs = "$env:TEMP\pdf_converted"
$dir_joined = "$env:TEMP\pdf_joined"
$subdirs = ($files.DirectoryName |sort -Unique) -replace "$dir_in_regex"
$subdirs |% {
    "$dir_out$_","$dir_pdfs$_","$dir_joined$_" |% {
        mkdir $_ -Force -ErrorAction SilentlyContinue > $null
    }
}

# Конвертация в PDF (во временный каталог 1)
$files |% {
    $dir_out_file = $_.DirectoryName -replace "$dir_in_regex","$dir_pdfs"
    & $proga -applyProfile -profile "default/good" -outputDir $dir_out_file -convertToPDF $_.FullName
}

# Подпись.pdf (во временный каталог 2)
$pdfs = dir $dir_pdfs -Recurse
$dir_in_regex = $dir_pdfs -replace '\\','\\'
$pdfs |% {
    $dir_out_file = $_.DirectoryName -replace "$dir_in_regex","$dir_joined"
    & $proga -profile "default/good" -outputDir $dir_out_file -join $_.FullName $sign
}

# Цифровая подпись (в конечный каталог)
$subdirs |% {
    & $cppdfutil sign -i "$dir_joined$_" -o "$dir_out$_" -c $cert
}

# Удаление временных каталогов
del $dir_pdfs,$dir_joined -Recurse -Force -Confirm:$false

v2: pdf24-DocTool.exe не складывает в ту же папку, нужен ещё один временный каталог.

titanich 02-06-2024 07:49 3027799

DJ Mogarych,
Спасибо за помощь! Скрипт выдает:
del : Не удается найти путь "C:\Users\Пользователь\AppData\Local\Temp\pdf_joined", так как он не существует.
F:\distributives\пакетное подписание файлов\bat1.ps1:35 знак:1
+ del $dir_joined -Recurse -Force -Confirm:$false
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Users\Пользо...Temp\pdf_joined:String) [Remove-Item], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand
сохраняет конвертированные в PDF файлы в каталоге input(неподписанные цифровой подписью), файлы без структуры каталогов, одним списком. Папка out пустая

DJ Mogarych 02-06-2024 09:21 3027800

Понятно, я думал, что pdf24-DocTool.exe в ту же папку кладёт.
Пробуйте, выше исправленный код.

titanich 02-06-2024 20:17 3027809

Вложений: 1
останавливается с ошибкой

DJ Mogarych 03-06-2024 09:05 3027824

Похоже, что у вас файл скрипта в неправильной кодировке сохранён.
Откройте Powershell ISE, вставьте туда код и сохраните скрипт.


Время: 10:09.

Время: 10:09.
© OSzone.net 2001-