PowerShell: использование Compress-Archive с Start-Job не работает

Я пытаюсь использовать PowerShell для сжатия кучи видеофайлов на моем диске H: \. Однако запуск этого серийного устройства займет много времени, так как диск довольно большой. Вот небольшой фрагмент кода, который я использую. Некоторые части были удержаны.

$shows = Get-ChildItem H:\
foreach($show in $shows){
    Start-Job -ArgumentList $show -ScriptBlock {
        param($show)
        $destPath = "$($show.DirectoryName)\$($show.BaseName).zip"
        Compress-Archive -Path $show.FullName -DestinationPath $destPath
    }
}

Когда я запускаю Get-Job, задание отображается как завершенное без причины в JobStateInfo, но .zip не был создан. Я провел несколько тестов, заменив команду Compress-Archive Out-File переменной $ destPath с помощью Start-Job.

Start-Job -ArgumentList $shows[0] -ScriptBlock {
    param($show)
    $show = [System.IO.FileInfo]$show
    $destPath = "$($show.DirectoryName)\$($show.BaseName).zip"
    $destPath | Out-File "$($show.DirectoryName)\test.txt"
}

Текстовый файл IS создан, и он показывает правильный путь назначения. Я запустил PowerShell от имени администратора и попробовал еще раз, но, похоже, это тоже не сработало. Не уверен, имеет ли это значение, но я использую Windows 10 (последняя версия).

Любая помощь будет оценена. Спасибо!


person Henry Yam    schedule 22.03.2020    source источник


Ответы (2)


По какой-то причине внутри задания сериализованный объект fileinfo не имеет базового имени (это свойство скрипта). Если у вас есть поточные работы, это работает.

dir | start-job { $input } | receive-job -wait -auto | 
  select name,basename,fullname

Name      basename FullName
----      -------- --------
file1.txt          C:\Users\js\foo\file1.txt
file2.txt          C:\Users\js\foo\file2.txt
file3.txt          C:\Users\js\foo\file3.txt
person js2010    schedule 23.03.2020
comment
Таким образом, это фактически показало мне, что я допустил какую-то ошибку в своем предыдущем тестировании, пытаясь выгрузить базовое имя в файл .txt, поскольку, когда я пытался воспроизвести тест, я больше не мог видеть baseName. То, что вы указали, было абсолютно правильным, и переключение на использование Start-ThreadJob после того, как я запустил задание потока Install-Module, сработало. Большое спасибо! - person Henry Yam; 24.03.2020

Не уверен, что это то, что вы хотите, но я думаю, вам сначала нужно создать архив, а затем обновить этот архив шоу, поэтому я создал zip под названием archive и зациклился на добавлении файлов.

$shows = Get-ChildItem H:\


foreach($show in $shows){


        Compress-Archive -Path $show.FullName -Update -DestinationPath "C:\archive"
  }
person 3N16M4    schedule 22.03.2020
comment
Ах. Не думайте, что это то, что я ищу. Я не пытаюсь добавить в существующий архив. Я пытаюсь создать архив. Для каждого шоу / эпизода должен быть отдельный файл .zip. Я все равно попробовал на всякий случай, если это сработает, но не вышло :(. Спасибо! - person Henry Yam; 23.03.2020