Скопируйте несколько файлов, заархивируйте и назовите архив с указанием даты и часа в Powershell

#date #timestamp #powershell-ise

#Дата #временная метка #powershell-ise

Вопрос:

У меня есть этот фрагмент кода:

 $sursa_folder="C:folderfolderfolderfolder"
$sursa_file="file"

$dest_folder="F: nameDump"

Copy-Item (Join-Path $sursa_folder $sursa_file) -Destination $dest_folder
try {Compress-Archive -Path (Join-Path $dest_folder $sursa_file) -CompressionLevel Optimal -DestinationPath ((Join-Path $dest_folder $sursa_file)   (Get-Date).ToString('ddMMyyyy-hh.mm.ss')   ".zip") -ErrorAction SilentlyContinue 
#Compress-Archive -Path (Join-Path $dest_folder $sursa_file) -CompressionLevel Optimal -DestinationPath ("X:"   (Get-Date).ToString('ddMMyyyy-hh.mm.ss')   ".zip") -ErrorAction SilentlyContinue Remove-Item (Join-Path $dest_folder $sursa_file) -Force -ErrorAction Stop Write-Host "finalizat OK"
}
catch {
write-host "Eroare: $_"
}
finally {

}
 

И я хочу добавить больше файлов в тот же архив. Как мне это сделать?

Я думал о чем-то таком:

 $sursa_folder="C:folderfolderfolderfolder"
$sursa_file="file1""file2""file3""file4""file5""file6""file7"

$dest_folder="F: nameDump"

Copy-Item (Join-Path $sursa_folder $sursa_file) -Destination $dest_folder
try {
Compress-Archive -Path (Join-Path $dest_folder $sursa_file) -CompressionLevel Optimal -DestinationPath ((Join-Path $dest_folder $sursa_file)   (Get-Date).ToString('ddMMyyyy-hh.mm.ss')   ".zip") -ErrorAction SilentlyContinue
#Compress-Archive -Path (Join-Path $dest_folder $sursa_file) -CompressionLevel Optimal -DestinationPath ("X:"   (Get-Date).ToString('ddMMyyyy-hh.mm.ss')   ".zip") -ErrorAction SilentlyContinue
Remove-Item (Join-Path $dest_folder $sursa_file) -Force -ErrorAction Stop
Write-Host "finalizat OK"
}
catch {
write-host "Eroare: $_"
}
finally {

}
 

Но безрезультатно…

Спасибо, читатель, за ваше время.

Л.Е.: Теперь конечный результат.

 # this function will zip an entire folder (in your case the destination folder)
function ZipFiles( $zipfilename, $sourcedir )
{
   Add-Type -Assembly System.IO.Compression.FileSystem
   $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
   [System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir,$zipfilename, $compressionLevel, $false)
}

$sursa_folder="C:folderfolderfolderfolder"
$sursa_file=@("file1","file2","file3","file4","file5","file6","file7") # <= eaxample name files, rename as needed.
$dest_folder= "F: nameDump"
$folderName = "File_Folder" # <= rename as needed.
$destinationfolder =  New-Item -Path (Join-Path $dest_folder $folderName) -ItemType Directory

foreach($file in $sursa_file)
{
Copy-Item (Join-Path $sursa_folder $file) -Destination (Join-Path $dest_folder $folderName) # this copies the item from source to destination >> destination is a folder within the destination
#Now you will have multiple files ("file1","file2","file3","file4","file5","file6","file7") that are copied from source to a destination folder
}

try {
ZipFiles -sourcedir (Join-Path $dest_folder $folderName) -zipfilename ((Join-Path $dest_folder $folderName)   (Get-Date).ToString('ddMMyyyy-hh.mm.ss')   ".zip") # zip the destination folder and give it a new name
Remove-Item -Path (Join-Path $dest_folder $folderName) -Force -ErrorAction Stop -Recurse -Confirm:$false # this will delete the unzipped old folder 
Write-Host "finalizat OK"
}
catch {
write-host "Eroare: $_"
}
finally {}
 

Большое вам спасибо, Клинт Оливейра, я бы не справился без вашей помощи. 🙂

Комментарии:

1. Это архив , а не «архив» …

2. что происходит при запуске вашего кода. Это не работает? у вас есть «-ErrorAction SilentlyContinue», попробуйте удалить это и дайте мне знать, если есть ошибка.

Ответ №1:

1 > Я хочу дать этой папке постоянное имя. Измените File_Folder имя папки на желаемое.

  • Заменить $folderName = Read-Host "Please Enter the folder Name" на $folderName = "File_Folder"

2> я не хочу, чтобы PowerShell запрашивал у меня подтверждение, если я хочу удалить дочерние элементы с помощью item со всеми.

  • Измените Remove-item строку на:
    Remove-Item -Path (Join-Path $dest_folder $folderName) -Force -ErrorAction Stop -Recurse -Confirm:$false

3> где я могу найти эту документацию для PS? Я имею в виду, я пытался найти в Google $folderName = и почти ничего не нашел. Только другие люди задают другие вопросы. Я знаю, что в cmd (я думаю… если я не ошибаюсь) вы можете использовать? или клавиша tab (я думаю), и вы можете получить список возможных команд. Как мне проверить это с помощью PS?

  • Документация PowerShell: https://docs.microsoft.com/en-us/powershell /
  • список возможных команд> используйте «Клавишу табуляции«, однако вам нужно ввести глагол, например. get- или set- etc этот фрагмент взят из PowerShell ISE введите описание изображения здесь

Комментарии:

1. Remove-Item -Path (Join-Path $dest_folder $ folderName) -Force -ErrorAction Stop -Recurse -Confirm:$false # Пожалуйста, удалите путь в своем комментарии .. его локальный путь не должен быть в Интернете. Очень признателен

2. Работает нормально, но я получаю это на этапе удаления: не удается найти путь ‘C:folderfolder_Syncfolder — потому что его не существует. Что это такое C:folderfolder_Syncfolder или трикс, если уж на то пошло? Попробовал поискать его в Google …

3. Команда удаления пытается удалить папку, которая была преобразована в zip-файл в месте назначения.

4. он пытается найти папку «(Join-Path $ dest_folder $ folderName)», чтобы он мог ее удалить. Remove-Item -Path (Join-Path $dest_folder $folderName) -Принудительная остановка ErrorAction -Рекурсия -Подтверждение:$false

Ответ №2:

Рассмотрите возможность преобразования вашей $sursa_file переменной в массив, а затем выполните следующие действия foreach ($file in $sursa_file) :

 $sursa_file=@("file1","file2","file3","file4","file5","file6","file7") 
 

Вы получаете сообщение об ошибке, поскольку Join-Path $sursa_folder $sursa_file
пытается выполнить запрос введите описание изображения здесь

Если вы преобразуете $sursa_file в массив и выполняете a foreach-object , то он будет искать правильный путь к файлу каждый раз в циклах, хотя ваша переменная so Join-Path $sursa_folder $sursa_file становится введите описание изображения здесь

Вот моя попытка: вы можете заполнить действия catch / finally самостоятельно.

 # this function will zip an entire folder (in your case the destination folder)
function ZipFiles( $zipfilename, $sourcedir )
{
   Add-Type -Assembly System.IO.Compression.FileSystem
   $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
   [System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir,$zipfilename, $compressionLevel, $false)
}

$sursa_folder="C:folderfolderfolderfolder"
$sursa_file=@("file1","file2","file3","file4","file5","file6","file7")
$dest_folder= "F: nameDump"
$folderName = Read-Host "Please Enter the folder Name"
$destinationfolder =  New-Item -Path (Join-Path $dest_folder $folderName) -ItemType Directory

foreach($file in $sursa_file)
{
Copy-Item (Join-Path $sursa_folder $file) -Destination (Join-Path $dest_folder $folderName) # this copies the item from source to destination >> destination is a folder within the destination
#Now you will have multiple files ("file1","file2","file3","file4","file5","file6","file7") that are copied from source to a destination folder
}

try {
ZipFiles -sourcedir (Join-Path $dest_folder $folderName) -zipfilename ((Join-Path $dest_folder $folderName)   (Get-Date).ToString('ddMMyyyy-hh.mm.ss')   ".zip") # zip the destination folder and give it a new name
Remove-Item (Join-Path $dest_folder $folderName) -Force -ErrorAction Stop # this will delete the unzipped old folder 
Write-Host "finalizat OK"
}
catch {
write-host "Eroare: $_"
}
finally {}
 

Комментарии:

1. Хорошо, это работает … вроде того… Но как мне поместить все файлы в один zip-файл? Я имею в виду, что я хочу взять @(«file1», «file2», «file3», «file4», «file5», «file6», «file7») и поместить их в один и тот же zip-файл с одним zip-файлом для каждого файла, я не хочу иметь отдельные ZIP-файлы… Имеет ли это какой-либо смысл для вас? Большое спасибо за понимание PwerShell.

2. переместите свои try, catch, наконец, из цикла for-each и сожмите местоположение назначения. >> Я отредактировал сценарий.. проверьте, работает ли это

3. Я думаю, нам нужно каким-то образом назвать этот файл в> Compress-Archive -Path $dest_folder < . Я полагаю, что это делало это: Compress-Archive -Path (Join-Path $ dest_folder $file), брал имя из файла, который хотел его заархивировать, и создавал zip из этого имени. И я не знаю почему, но последний файл не копирует его, хотя он отображается в тестовом запуске «результат».

4. @BogdanNicolescu Я отредактировал сценарий в соответствии с вашими требованиями. Я добавил к нему комментарии, чтобы помочь вам. Надеюсь, это ответит на ваши вопросы и удовлетворит ваши требования. Какое имя вы хотите присвоить zip-файлу?

5. Текущий сценарий будет использовать имя папки назначения с помощью > $dest_folder . Разделить («»)[-1]