Форум программистов, компьютерный форум, киберфорум
Наши страницы
PowerShell
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/10: Рейтинг темы: голосов - 10, средняя оценка - 4.50
ilfaty
5 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 21
#1

Архивация папок и файлов и отправка их по почте

19.02.2016, 08:17. Просмотров 1864. Ответов 29
Метки нет (Все метки)

Добрый день, третий день могу найти скрипт который бы архивировал нужные папки и файлы, которые находятся в разных местах на одном компьютере, в один ZIP архив с определенным названием и датой и отправлял бы этот архив на почту.
Пожалуйста, если есть возможность не давать мне ссылки на похожие скрипты но не с полным функционалам, я не смогу склеить два три скрипта в один.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2016, 08:17
Ответы с готовыми решениями:

Архивация файлов
Есть скрипт, который берёт файлы с папки и архивирует в другую папку: ...

Список измененных файлов и папок
Написать скрипт, который будет мониторить все изменения сделанные под...

Влияет ли количество папок и файлов в одном каталоге на производительность?
Добрый день. 1) Есть ли разница, в системе NTFS, если скажем в каталог2...

Где/чем/как просмотреть список зашифрованных с помощью EFS файлов/папок?
Винда без включённой EFS прекрасно работала несколько лет, и тут ни с того ни с...

Создание папок с именами, соответсвующими расширениям имеющихся файлов, но без начальной точки
Создаю папки в powershell для файлов с разными расширениями.Название папок идет...

29
KDE777
716 / 531 / 228
Регистрация: 22.01.2016
Сообщений: 1,491
19.02.2016, 09:47 #2
Цитата Сообщение от ilfaty Посмотреть сообщение
найти скрипт который бы архивировал нужные папки и файлы, которые находятся в разных местах на одном компьютере, в один ZIP архив
Какая у вас версия ОС?
По каким условиям должны быть выбраны нужные файлы и папки?

Вот например скрипт, который добавляет в архив только ReadOnly файлы. Отправить по почте этот архив - это ещё одна строчка:

PowerShell
1
Send-MailMessage -Body "Hello" -From "1@mail.ru" -To "1@ya.ru" -Subject "Data File" -Attachments "c:\temp\data.zip" -SmtpServer smtp.mail.ru -Port 587 -Credential $creds
0
ilfaty
5 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 21
19.02.2016, 11:26  [ТС] #3
Windows Server 2008 R2
Условия прямые, вот эту папку со всем содержимым и вот этот конкретный файл.
0
greg zakharov
19.02.2016, 11:35
  #4

Не по теме:

Цитата Сообщение от ilfaty
Условия прямые, вот эту папку со всем содержимым и вот этот конкретный файл.
У Вас какой дан по телепатии и цвет пояса по дзен?

0
ilfaty
5 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 21
19.02.2016, 11:50  [ТС] #5
D:\test
D:\test2\1
c:\test3\test.txt
0
greg zakharov
Покинул форум
1947 / 823 / 236
Регистрация: 07.05.2015
Сообщений: 1,645
19.02.2016, 12:42 #6
ilfaty, неужто такая сложная наука?
PowerShell
1
2
&7za a -mx9 -r C:\temp\test.zip D:\test D:\test2\1 C:\test3\test.txt
Send-MailMessage -Body "Test" -From "1@mail.ru" -To "1@ya.ru" -Subject "Testing msg" -Attachments "C:\temp\test.zip" -SmtpServer smtp.mail.ru -Port 587 -Credential $creds
0
KDE777
716 / 531 / 228
Регистрация: 22.01.2016
Сообщений: 1,491
19.02.2016, 13:23 #7
ilfaty, в файле C:\Temp\to_zip.txt список нужных файлов и папок

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$ZipFile = 'C:\Temp\test_' + (Get-Date).ToShortDateString() + '.zip'
$ListItem = 'C:\Temp\to_zip.txt'
 
Add-Type -AssemblyName System.IO.Compression.FileSystem
$Archive = [System.IO.Compression.ZipFile]::Open($ZipFile, "Update")
$Archive.Dispose()
 
$shell = New-Object -ComObject shell.application
$zip = $shell.NameSpace($ZipFile)
 
foreach ($str in Get-Content -Path $ListItem -Encoding Default)
{
if (Test-Path -Path $str)
    {
    $zip.CopyHere($str)
    Start-Sleep -Seconds 1
    }
else {Write-Host "$str - не найдено!" -f Red}
}
 
$pwd = ConvertTo-SecureString "Password" -AsPlainText -Force
$from = "out@mail.ru"
$creds = New-Object System.Management.Automation.PSCredential($from, $pwd)
 
Send-MailMessage -to "in@ya.ru" `
-from $from `
-smtp "smtp.mail.ru" `
-port 587 `
-useSSL `
-subject "Zip file" `
-body "Hello!" `
-Attachments $ZipFile `
-Credential $creds
Из-за того, что метод CopyHere асинхронный добавлено (Start-Sleep -Seconds 1), но это костыль и по хорошему надо делать проверку на блокировку архива и ждать пока он освободится...
0
ilfaty
5 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 21
19.02.2016, 15:36  [ТС] #8
KDE777, Ошибки вышли
Код
Add-Type : Не удалось добавить тип. Не удалось найти сборку "System.IO.Compression.FileSystem".
D:\ScriptS\Consultant\Otpravka_otcheta_obnov.ps1:4 знак:9
+ Add-Type <<<<  -AssemblyName System.IO.Compression.FileSystem
    + CategoryInfo          : ObjectNotFound: (System.IO.Compression.FileSystem:String) [Add-Type], E
    + FullyQualifiedErrorId : ASSEMBLY_NOT_FOUND,Microsoft.PowerShell.Commands.AddTypeCommand

Add-Type : Не удалось добавить тип. Одна или более сборок отсутствуют.
D:\ScriptS\Consultant\Otpravka_otcheta_obnov.ps1:4 знак:9
+ Add-Type <<<<  -AssemblyName System.IO.Compression.FileSystem
    + CategoryInfo          : InvalidData: (:) [Add-Type], InvalidOperationException
    + FullyQualifiedErrorId : ASSEMBLY_LOAD_ERRORS,Microsoft.PowerShell.Commands.AddTypeCommand

Невозможно найти тип [System.IO.Compression.ZipFile]: убедитесь в том, что сборка, содержащая этот ти
D:\ScriptS\Consultant\Otpravka_otcheta_obnov.ps1:5 знак:43
+ $Archive = [System.IO.Compression.ZipFile] <<<< ::Open($ZipFile, "Update")
    + CategoryInfo          : InvalidOperation: (System.IO.Compression.ZipFile:String) [], RuntimeExc
    + FullyQualifiedErrorId : TypeNotFound

Нельзя вызвать метод для выражения со значением NULL.
D:\ScriptS\Consultant\Otpravka_otcheta_obnov.ps1:6 знак:17
+ $Archive.Dispose <<<< ()
    + CategoryInfo          : InvalidOperation: (Dispose:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Get-Content : Не удается привязать параметр "Encoding". Не удается преобразовать значение "Default" в
werShell.Commands.FileSystemCmdletProviderEncoding" из-за недопустимых значений перечисления. Укажите
 значений перечисления и повторите попытку. Возможны следующие значения перечисления: "Unknown, Strin
BigEndianUnicode, UTF8, UTF7, Ascii".
D:\ScriptS\Consultant\Otpravka_otcheta_obnov.ps1:11 знак:55
+ foreach ($str in Get-Content -Path $ListItem -Encoding <<<<  Default)
    + CategoryInfo          : InvalidArgument: (:) [Get-Content], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetContent

Send-MailMessage : Не удается найти параметр, соответствующий имени параметра "port".
D:\ScriptS\Consultant\Otpravka_otcheta_obnov.ps1:28 знак:6
+ -port <<<<  587 `
    + CategoryInfo          : InvalidArgument: (:) [Send-MailMessage], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.SendMailMessage
0
KDE777
716 / 531 / 228
Регистрация: 22.01.2016
Сообщений: 1,491
19.02.2016, 15:50 #9
Цитата Сообщение от ilfaty Посмотреть сообщение
Не удается найти параметр, соответствующий имени параметра "port"
Значит у вас PowerShell 2.0 - обновить не хотите?

Цитата Сообщение от ilfaty Посмотреть сообщение
Невозможно найти тип [System.IO.Compression.ZipFile]
Попробуйте запаковать вот так:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ZipFile = 'C:\Temp\test_' + (Get-Date).ToShortDateString() + '.zip'
$ListItem = 'C:\Temp\to_zip.txt'
 
Set-Content -Path $ZipFile -Value ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
 
$shell = New-Object -ComObject shell.application
$zip = $shell.NameSpace($ZipFile)
 
foreach ($str in Get-Content -Path $ListItem)
{
if (Test-Path -Path $str)
    {
    $zip.CopyHere($str)
    Start-Sleep -Seconds 1
    }
else {Write-Host "$str - не найдено!" -f Red}
}
Работает?

И куда вам нужно отправлять этот файл? Вам нужно использовать SMTP-порт отличный от 25? Если нет, то отправляйте так:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
$pwd = ConvertTo-SecureString "Password" -AsPlainText -Force
$from = "out@mail.ru"
$creds = New-Object System.Management.Automation.PSCredential($from, $pwd)
 
Send-MailMessage -to "in@ya.ru" `
-from $from `
-smtp "smtp.mail.ru" `
-subject "Zip file" `
-body "Hello!" `
-Attachments $ZipFile `
-Credential $creds
0
ilfaty
5 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 21
19.02.2016, 15:59  [ТС] #10
KDE777, Ошибка

Код
Get-Content : Не удается найти путь "D:\ScriptS\Consultant\to_zip.txt", так как он не существует
D:\ScriptS\Consultant\Otpravka_otcheta_obnov.ps1:10 знак:29
+ foreach ($str in Get-Content <<<<  -Path $ListItem)
    + CategoryInfo          : ObjectNotFound: (D:\ScriptS\Consultant\to_zip.txt:String) [Get-Con
   eption
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand

Файл to_zip.txt сто пудов есть
0
KDE777
716 / 531 / 228
Регистрация: 22.01.2016
Сообщений: 1,491
19.02.2016, 16:04 #11
Цитата Сообщение от ilfaty Посмотреть сообщение
Файл to_zip.txt сто пудов есть
Ну чудес не бывает либо - файла нет, либо нет к нему доступа

Откройте просто PS консоль и проверьте:

PowerShell
1
gc "D:\ScriptS\Consultant\to_zip.txt"
0
ilfaty
5 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 21
19.02.2016, 16:11  [ТС] #12
Сам в шоке, тоже выходит ошибка.
С свойствах файла в Безопасности добавил Все и полный доступ.
Если копирую путь из ошибки и вставляю в проводник то файл открывается.

Добавлено через 2 минуты
Еще прикол, архив в итоги сформировался и отправил на почту, но только пустой.
Еще проблема, в скрипте добавил тему письма на кириллице и в почте пришли вместо текста вопросительные знаки.
0
KDE777
716 / 531 / 228
Регистрация: 22.01.2016
Сообщений: 1,491
19.02.2016, 16:21 #13
Цитата Сообщение от ilfaty Посмотреть сообщение
в скрипте добавил тему письма на кириллице и в почте пришли вместо текста вопросительные знаки.
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
$pwd = ConvertTo-SecureString "Password" -AsPlainText -Force
$from = "out@mail.ru"
$creds = New-Object System.Management.Automation.PSCredential($from, $pwd)
$encoding = [System.Text.Encoding]::Unicode
 
Send-MailMessage -to "in@ya.ru" `
-from $from `
-smtp "smtp.mail.ru" `
-subject "Zip file" `
-body "Hello!" `
-Attachments $ZipFile `
-Encoding $encoding `
-Credential $creds
вместо Unicode можете попробовать UTF7 или UTF8

Добавлено через 2 минуты
Цитата Сообщение от ilfaty Посмотреть сообщение
Еще прикол, архив в итоги сформировался и отправил на почту, но только пустой
Так и должно быть - сначала создаётся пустой zip-архив, а потом в него добавляются файлы из вашего списка (который не находится).

Добавлено через 3 минуты
Попробуйте без кавычек или с другими кавычками:

PowerShell
1
2
gc D:\ScriptS\Consultant\to_zip.txt
gc 'D:\ScriptS\Consultant\to_zip.txt'
0
ilfaty
5 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 21
19.02.2016, 16:22  [ТС] #14
А можно сделать так чтобы если есть ошибка то нечего не отправлял?
0
KDE777
716 / 531 / 228
Регистрация: 22.01.2016
Сообщений: 1,491
19.02.2016, 16:25 #15
+ принудительно запустите PowerShell от администратора

Добавлено через 2 минуты
Цитата Сообщение от ilfaty Посмотреть сообщение
А можно сделать так чтобы если есть ошибка то нечего не отправлял?
PowerShell
1
Get-Content -Path $ListItem -ErrorAction Stop
0
ilfaty
5 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 21
19.02.2016, 16:25  [ТС] #16
Цитата Сообщение от KDE777 Посмотреть сообщение
Попробуйте без кавычек или с другими кавычками:
непомогло
0
KDE777
716 / 531 / 228
Регистрация: 22.01.2016
Сообщений: 1,491
19.02.2016, 16:26 #17
Цитата Сообщение от ilfaty Посмотреть сообщение
непомогло
"принудительно запустите PowerShell от администратора" - пробовали?
0
ilfaty
5 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 21
19.02.2016, 16:40  [ТС] #18
Цитата Сообщение от KDE777 Посмотреть сообщение
+ принудительно запустите PowerShell от администратора

Добавлено через 2 минуты
Цитата Сообщение от ilfaty Посмотреть сообщение
А можно сделать так чтобы если есть ошибка то нечего не отправлял?
PowerShell
1
Get-Content -Path $ListItem -ErrorAction Stop
STOP поставил вначале
запустил под админом
Ошибка:

Код
Get-Content : Не удается привязать аргумента к параметру "Path", так как он имеет значение
D:\ScriptS\Consultant\Otpravka_otcheta_obnov.ps1:1 знак:18
+ Get-Content -Path <<<<  $ListItem -ErrorAction Stop
    + CategoryInfo          : InvalidData: (:) [Get-Content], ParameterBindingValidationExc
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.Powe
   ommand

Get-Content : Не удается найти путь "D:\ScriptS\Consultant\to_zip.txt", так как он не сущес
D:\ScriptS\Consultant\Otpravka_otcheta_obnov.ps1:8 знак:29
+ foreach ($str in Get-Content <<<<  -Path $ListItem)
    + CategoryInfo          : ObjectNotFound: (D:\ScriptS\Consultant\to_zip.txt:String) [Ge
   eption
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
Добавлено через 6 минут
А может пути к папкам который в файле to_zip.txt прямо в скрипте прописать?
0
KDE777
716 / 531 / 228
Регистрация: 22.01.2016
Сообщений: 1,491
19.02.2016, 16:47 #19
Цитата Сообщение от ilfaty Посмотреть сообщение
Ошибка
Ну как просили - при ошибке скрипт останавливается, письмо не отправляется.

А зачем вы всё время запускаете весь скрипт? Ошибка ясна - не удаётся найти файл с списком для архивации.

Добейтесь сначала, что бы просто

PowerShell
1
gc "D:\ScriptS\Consultant\to_zip.txt"
отрабатывало без ошибок, а затем уже запускайте весь скрипт.

1. Сделайте папку на диске C, например - C:\Temp\
2. Создайте в ней новый текстовый файл 1.txt и вставьте в него нужный список
3. Сохраните файл
4. Выполните в PS консоли:

PowerShell
1
gc C:\Temp\1.txt
Так работает?

Добавлено через 2 минуты
Цитата Сообщение от ilfaty Посмотреть сообщение
А может пути к папкам который в файле to_zip.txt прямо в скрипте прописать?
Можете заменить:

Get-Content -Path $ListItem

На:

Get-Content -Path "D:\ScriptS\Consultant\to_zip.txt"
0
ilfaty
5 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 21
19.02.2016, 16:47  [ТС] #20
Цитата Сообщение от KDE777 Посмотреть сообщение
Так работает?
нет
0
19.02.2016, 16:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2016, 16:47

Отправка файлов на почту
Как отправить файлы на почтовый ящик? Как просто письмо отправить, я...

Архивация выбранных папок+файлов в текущей директории
добрый день, понадобилось собирать zip-архив с нужными папками в текущей...

Отправка файлов по почте
Сделал бат который делает резервное копирование важных файлов, и у меня не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru