все что связано с моей работой
Главная » Програмирование » PowerShell. Начало.

PowerShell. Начало.

Хоть PowerShell и существует давно и даже дорос до версии 3, но отсутствие практических задач и использование XP все время сдерживало изучение.

Но вот сервер переехал на 2008 и 2012, а там PS уже используется «по умолчанию». И большинство серверных задач можно теперь переводить на PS.

Итак, начало! Надо признать что изучение, чуть больше 10 страниц любой книги по нему, оставляет неоднозначное впечатление.

Мощь, это дааа. Действительно впечатляет, но это же и является скорее недостатком. По факту это обертка для .NET, чтобы использовать его в шелле. ВСЕ — это объект .NET, отсюда и мощь, но отсюда и излишняя сложность.

Буду укрощать эту мощь и когда-нибудь незаметно стану .NET программистом.

Практика.

Был скрипт который каждую ночь архивировал документы пользователей и скидывал их на внешнее хранилище.
@echo off
rem *************************************************************
rem Путь "куда" складывать архивы, внешнее хранилище
set Dest="\\192.168.61.14\backup\server\users\"
rem *************************************************************

cd d:\
del /Q /F ~users.last
ren ~users.log ~users.last

f:
cd f:\
setlocal enableextensions
set arcname=%Dest%users_%date:~-4%%date:~3,2%%date:~0,2%.7z
echo Making archive : %arcname%...
date /t > d:\~users.log
time /t >> d:\~users.log
time /t
"c:\Program Files\7-Zip\7z.exe" a "%arcname%" "f:\users" -xr@d:\ex.lst -t7z -mx9 -mmt -scsWIN >> d:\~users.log
if %ERRORLEVEL% NEQ 0 (
echo Error
time /t >> d:\~users.log
time /t
exit 1
)
time /t >> d:\~users.log
time /t
exit 0

Самое сложное это было получить имя файла в виде даты. И главный недостаток — это то что периодически надо было чистить NAS от старых архивов, иначе место быстро заканчивалось.

Вот как получилось эта же задача на PS:

$7z="c:\Program Files\7-Zip\7z.exe"
$what="w:\obmen" #Куда
$where="\\nas\volume_1\Backup\server\users" #Что
New-PSDrive -Name BKP -PSProvider Filesystem -Root $where
cd BKP:
$fn='users_'+(Get-Date -uformat "%Y%m%d")+'.7z'
& $7z a $fn $what -t7z -mx9 -mmt -scsWIN

# удалить архивы месяцем ранее
$prev_month=(Get-Date).addmonths(-1)
ls -Path * -Include *.7z | Where-Object -FilterScript {($_.LastWriteTime -le $prev_month)} | Remove-Item -Force

cd C:\
Remove-PSDrive BKP

Скрипт не только архивирует с правильным именем, но и удаляет архивы старее месяца (30 дней). По факту все это можно было записать в 2 строчки, но это первый опыт, поэтому все подробно, чтоб можно было отлаживать. И очень хотелось использовать подключение «дисков» (New-PSDrive).

Из «засад» было только исполнение внешней команды, а именно надо ставить знак амперсанда (&) перед командой, иначе PS все что в кавычках воспринимает как строку.
Для первого раза хватит, весьма понравилось, теперь буду искать что еще можно переделать.

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

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.