Powershell + 7zip для пакетного извлечения и переименования - сообщение «Нет файлов для обработки» - PullRequest
0 голосов
/ 16 мая 2019

Отредактировано:

Первоначально у меня возник вопрос, почему первый фрагмент кода не работает.действие unzip работало, если я запускаю его самостоятельно для одного файла вне цикла.но как только я обернул его циклом, он не будет работать, и красной ошибки тоже не было.

Thansk @nemze, его / ее ответ вдохновил меня на изменение кода:1009 *

$7ZipPath = "C:\7z\7za"
$zipFolderRoot = "Z:\long folder path\Test Folder\Unzip Test"
$zipOutPath = "Z:\long folder path\Test Folder\Unzip Test\Unzip"
$zipFilePassword = "TEST123"
ls -Path $zipFolderRoot -directory -Exclude Unzip

Foreach ($zipFolderChild in (ls -Path $zipFolderRoot -directory -Exclude Unzip))
{
$zipFile = '"$zipFolderChild"+"\"+"Data.zip"'
$command = "& $7ZipPath x -o'$zipOutPath' -y -p$zipFilePassword $zipFile"
iex $command
#file rename command that I have not written yet
}

Кому:

$7ZipPath = "C:\7z\7za"
$zipFolderRoot = "Z:\long folder path\Test Folder\Unzip Test"
$zipOutPath = "Z:\long folder path\Test Folder\Unzip Test\Unzip"
$zipFilePassword = "TEST123"
ls -Path $zipFolderRoot -directory -Exclude Unzip

Foreach ($zipFolderChild in (ls -Path $zipFolderRoot -directory -Exclude Unzip))
{
$zipFile = "$zipFolderChild"+"\"+"Data.zip"
$command = "& $7ZipPath x -o'$zipOutPath' -y -p$zipFilePassword ""$zipFile"""
iex $command
#file rename command that I have not written yet
}

Перемещая определение $zipFile за пределы цикла ForEach, это работает!

Я думаю, что мое второе препятствие теперь движетсячтобы мои файлы были переименованы в цикле.

Что я пытаюсь достичь:

  • Data.xls из папки 20181001 переименовать в 20181001.xls
  • Данные.xls из 20181008 переименовывает папку в 20181008.xls

Исправленный код все еще читает $zipFolderChild как полный путь, как я могу извлечь имя папки ТОЛЬКО вместо этого?

EDIT3:

Попытка вставить переименование в цикл, но не знаю, как заставить работать аргумент -NewName, очистка $zipFolderChild.Name.xls не работает.Также пробовал:

$folder= $zipFolderChild.Name
#file rename command that I have not written yet
$rename = "-path", "$zipOutPath\Data.xls" ,"-NewName", "$folder.xls"
& Rename-Item @rename

внутри цикла, тоже не работает.

НАКОНЕЦ РАБОТЫ:

$7ZipPath = "C:\7z\7za"
$zipFolderRoot = "Z:\long folder path\Test Folder\Unzip Test"
$zipOutPath = "Z:\long folder path\Test Folder\Unzip Test\Unzip"
$zipFilePassword = "TEST123"
ls -path $zipFolderRoot -directory -Exclude Unzip

Foreach ($zipFolderChild in (ls -path $zipFolderRoot -directory -Exclude Unzip))
{
$zipFile = "$zipFolderChild\Data.zip"
$cmd = "& $7ZipPath x -o'$zipOutPath' -y -p$zipFilePassword ""$zipFile"""
iex $cmd

$folder= $zipFolderChild.Name
$xlsFile = "$zipOutPath\Data.xls"
$NewName = "$zipOutPath\$folder.xls"
&  Rename-Item -Path "$zipOutPath\Data.xls" -NewName $NewName
}

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Это работает для меня:

$7ZipPath = "C:\7z\7za"
$zipFolderRoot = "Z:\long folder path\Test Folder\Unzip Test"
$zipOutPath = "Z:\long folder path\Test Folder\Unzip Test\Unzip"
$zipFilePassword = "TEST123"

Get-ChildItem -Path $zipFolderRoot -Exclude Unzip -Directory

Foreach ($zipFolderChild in (Get-ChildItem -Path $zipFolderRoot -Exclude Unzip))
{
    $zipFile = "$zipFolderChild\Data.zip" 
    $command = "x", "$zipFile", "-p$zipFilePassword", "-y", "-o$zipOutPath"
    & $7ZipPath @command
    #file rename command that I have not written yet
}

Я использовал splatting для $command.

Редактировать: некоторые примеры для второго вопроса ОП.

Попробуйте оба примера и посмотрите, что получится.

Во-первых:

$i = 0
Foreach ($zipFolderChild in (Get-ChildItem -Path $zipFolderRoot -Exclude Unzip))
{
    $zipFolderChild.name
    Write-Output "step"
}

Второе:

$i = 0
$folder = Get-ChildItem -Path $zipFolderRoot -Exclude Unzip
Foreach ($zipFolderChild in $folder)
{      
    $folder[$i].name
    Write-Output $i
    $i++
}
1 голос
/ 16 мая 2019

Работает ли это лучше?

& $7ZipPath x -o$zipOutPath -y -p$zipFilePassword $zipFile

$ zipFile не будет получать переменные в одинарных кавычках:

 $zipFile = "$zipFolderChild" + "\" + "Data.zip"
...