Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» PowerShell

Автор: Oldster
Дата сообщения: 02.09.2013 11:15
Pompeii
$ext = Get-Content $IncludeFiles
а в файле - каждое расширение с новой строки, должно сработать
Автор: xsoft2
Дата сообщения: 09.09.2013 08:52
Только не пинайте, использую надстройку к шеллу ActiveRoles Management Shell
Она запускается C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -command ". 'C:\Program Files\Quest Software\Management Shell for AD\qsft.ps1'"
в неё делаю копи паст скрипта на выполнение.. как это всё сделать через крон ? Уже устал интернет ковырять, как простые скрипты запускать через крон умею, а через надстройку понять не могу.
Разобрался
C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -psconsolefile "C:\Program Files\Quest Software\Management Shell for AD\ConsoleSettings.psc1" -noexit -command ". 'F:\invent.ps1'"
Автор: dariusii
Дата сообщения: 28.09.2013 15:54
PoerShell теряет историю набранных команд. Кто-нибудь знает, как это исправить?
Автор: BVV63
Дата сообщения: 07.10.2013 12:54
Подскажите, в PowerShell имеется аналог переменных %1, %2, %3 и т. п. батника, и если да - то какой?
Автор: Oldster
Дата сообщения: 07.10.2013 13:45
BVV63
в самом начале (!!!) скрипта:
Param (
$Servers = 'my.com',
$User = 'user1'
)

потом при вызове: my.ps1 -Server "test.com" -User "user2"
Автор: KapralBel
Дата сообщения: 07.10.2013 13:46
BVV63
Есть
См. Ошибки и предупреждения в журнале событий по электронной почте (в4.0)
Автор: Lich130387
Дата сообщения: 23.10.2013 06:15
Как печатать на принтере? Нигде не нашёл. Нужно печатать pdf-документ.
Автор: Lich130387
Дата сообщения: 25.10.2013 12:52
Решил проблему написанием такого скрипта:

Код: cls

function Print-File ($FilePath=“f:\test\Tst.pdf”)
{
Start-Process –FilePath $FilePath –Verb Print -PassThru | %{sleep 10;$_} | kill
}

function Get-DefaultPrinter {
$printer = Get-WmiObject win32_printer
foreach($prn in $printer) {
if ($prn.Default) {return $prn}
}

}

function Set-DefaultPrinter ($name) {
if (!$name) {
Write-Host "Не указано имя принтера. Операция прервана"
return 0
}
else {
$internal = GWMI -class Win32_Printer | Where {$_.Name -eq $name}
$internal.SetDefaultPrinter()
return 1
}
}

$printer = Get-WmiObject win32_printer
$DefPrnName = $NULL
$prns = @()
$i = 1

$DefPrnName = (Get-DefaultPrinter).Name

do
{
Write-Host "Печатать на принтере, выбранном по умолчанию ($DefPrnName)? (y - yes,n - no, x - exit)"
$ans1 = Read-Host
if ($ans1 -eq "x") {exit}
} until (($ans1 -ine "y") -or ($ans1 -ine "n"))


If ($ans1 -eq "y") {Print-File}
elseif ($ans1 -eq "n")
{
Write-Host "Выберете принтер для печати тестовой страницы:"
foreach($prn in $printer)
{
$prns += $prn
Write-Host $i -NoNewline
Write-Host (") "+$prn.Name)
$i++
}
Write-Host "0) Выход"

$i--
$numprn = Read-host

If ($numprn -eq 0) {exit}
$result = $NULL
If ($numprn -match "[1-$i]") {
$result = Set-DefaultPrinter ($prns[$numprn-1].Name)
$DefPrnName = (Get-DefaultPrinter).Name
Write-Host "По умолчанию установлен принтер $DefPrnName"
}
If ($result -eq "1") {Print-File}
}
Автор: Lich130387
Дата сообщения: 31.10.2013 09:08
а как запускать скрипты, просто дважды щёлкнув на файл со скриптом ??? что-то везде выдаёт что-то красным и закрывается. сам тип файлов связал с powershell.exe

Всё. Сам понял, почему так. В пути к файлу со скриптом содержались пробелы. Убрал пробелы, и всё пошло, как по маслу.
Автор: KapralBel
Дата сообщения: 31.10.2013 09:24
а из самого ПС запуск работает?
Автор: chand1er
Дата сообщения: 13.12.2013 10:46
[more] Доброго дня!

Обрисую ситуацию:
Есть такой получаемый датасет :
[more]
--VOLUME INFORMATION--
Num Disks: 2
State: Normal
--END DEVICE INFORMATION--

ID: 0-0-0-0
State: Normal
Model: WDC WD5003ABYX-01WERA0

ID: 0-1-0-0
State: Normal
Model: WDC WD5003ABYX-01WERA0

Из него мне необходимо выдернуть и вернуть значения "State". Так, чтобы в результате запроса выдавалось только значение параметра. То есть: выбрать строку, выбрать значение, откинуть лишнее.

>$CLI            = 'C:\RAID\rstcli64.exe'
>$dstate0 = & $CLI -I -d 0-0-0-0 | Select-string "State"
>Write-host "$dstate0"

Результат

>State: Normal

Из строки интересует только значение, т.е. "Normal". Как откинуть лишнее?

Проблема еще в том, что есть строки с одинаковыми именами "State", и то надо учитывать при выборке и есть два нижних значения можно отфильтровать по "ID", то в случае с Volume Information это сделать не получится.

Поскольку с Powershell`ом не очень ) - подскажите в какую сторону дальше копать, для того чтобы выбирать необходимые строки и значения? [/more] [/more]
Автор: angeltwo
Дата сообщения: 14.12.2013 00:47
chand1er
[more]
Примерно так. Последние 2 строки - примеры обращения к конкретным значениям.

Код:
[no]
$str = '[more]
--VOLUME INFORMATION--
Num Disks: 2
State: Normal
--END DEVICE INFORMATION--

ID: 0-0-0-0
State: Normal
Model: WDC WD5003ABYX-01WERA0

ID: 0-1-0-0
State: Normal
Model: WDC WD5003ABYX-01WERA0'

$hshIniContents = @{}
$str -split "\n" | %{
    switch -regex ($_) {
        "\[(.+)\]" {$strHeading = $Matches[1]; if ($strHeading) {$hshIniContents[$strHeading] = @{};$strID = ""}}
        "ID:[^\d]*((\d*-?){4}).*" {$strID = $Matches[1]; if ($strID) {$hshIniContents[$strHeading][$strID] = @{}};break}
        "(.*):\s*([^\r\n]*)" {$strKey = $Matches[1];$strValue = $Matches[2]; if ($strKey -and $strID){$hshIniContents[$strHeading][$strID][$strKey] = $strValue}
            else {$hshIniContents[$strHeading][$strKey] = $strValue}}
    }
}

$hshIniContents["more"]["Num Disks"]
$hshIniContents["more"]["0-1-0-0"]["State"]
[/no]
Автор: chand1er
Дата сообщения: 16.12.2013 08:32
angeltwo - спасибо за ответ и помощь!

тег [more] - это тут на форуме скрыло большое сообщение

Дело в том, что в моем случае датасет берется из обращения к 'C:\RAID\rstcli64.exe -I -d 0-0-0-0'
И пока неясно как выдернуть параметр "State" из раздела "Volume Information"
Я пробую совместить ваш вариант и свой, но пока что-то не вытанцовывается.
Автор: KapralBel
Дата сообщения: 16.12.2013 08:47
PS 4.0 http://www.microsoft.com/ru-ru/download/details.aspx?id=40855
Автор: angeltwo
Дата сообщения: 16.12.2013 18:54
chand1er
У меня такой утилиты нет, но попробую на другом примере пояснить.
Вывод команды получаем например так $a = ping -n 1 127.0.0.0

В Вашем случае вероятно это будет
$str = C:\RAID\rstcli64.exe -I -d 0-0-0-0
И тут надо смотреть, что получается в этой переменной. Если датасет такой, как Вы и приводили в примере, то так и берется значение, как я в конце привел (только я там для Num Disks писал):
$hshIniContents["more"]["State"]

Только параметр -d 0-0-0-0 в Вашей команде я так понимаю по Id фильтрует, мож без него попробовать. Вобщем. покажите. что получается в переменной $str = C:\RAID\rstcli64.exe -I -d 0-0-0-0

Добавлено:
Если тега [more] вообще нет в датасете, то просто не используйте его. Значение тогда должно получаться так $hshIniContents["State"]

Код:
$str = '--VOLUME INFORMATION--
Num Disks: 2
State: Normal
--END DEVICE INFORMATION--

ID: 0-0-0-0
State: Normal
Model: WDC WD5003ABYX-01WERA0

ID: 0-1-0-0
State: Normal
Model: WDC WD5003ABYX-01WERA0'

$hshIniContents = @{}
$str -split "\n" | %{
switch -regex ($_) {
"ID:[^\d]*((\d*-?){4}).*" {$strID = $Matches[1]; if ($strID) {$hshIniContents[$strID] = @{}};break}
"(.*):\s*([^\r\n]*)" {$strKey = $Matches[1];$strValue = $Matches[2]; if ($strKey -and $strID){$hshIniContents[$strID][$strKey] = $strValue}
else {$hshIniContents[$strKey] = $strValue}}
}
}

$hshIniContents["0-1-0-0"]["State"] #значение State для опредленного ID
$hshIniContents["Num Disks"] #значение из --VOLUME INFORMATION--
$hshIniContents["State"] #значение из --VOLUME INFORMATION--
Автор: chand1er
Дата сообщения: 17.12.2013 06:42
[more] [more] [more] при выполнении $cli= C:\Raid\rstcli64.exe -I -d 0-0-0-0 > C:\Raid\pdisk0.txt
PS ругается на

Код:
rstcli64.exe :
строка:1 знак:27
+ $cli= C:\Raid\rstcli64.exe <<<< -I -d 0-0-0-0 > C:\Raid\pdisk0.txt
+ CategoryInfo : NotSpecified: (:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

0

Автор: angeltwo
Дата сообщения: 17.12.2013 21:04
chand1er

Цитата:
Если выполнить ваш оригинальный скрипт из powershell ise, то результат
[more]
PS C:\Windows\system32> C:\RAID\test2.ps1
Не удается индексировать в массив NULL.
C:\RAID\test2.ps1:18 знак:119
+ "(.*):\s*([^\r\n]*)" {$strKey = $Matches[1];$strValue = $Matches[2]; if ($strKey
-and $strID){$hshIniContents[$strID][ <<<< $strKey] = $strValue}
+ CategoryInfo : InvalidOperation: (Num Disks:String) [], RuntimeExc
eption
+ FullyQualifiedErrorId : NullArray

Не удается индексировать в массив NULL.
C:\RAID\test2.ps1:18 знак:119
+ "(.*):\s*([^\r\n]*)" {$strKey = $Matches[1];$strValue = $Matches[2]; if ($strKey
-and $strID){$hshIniContents[$strID][ <<<< $strKey] = $strValue}
+ CategoryInfo : InvalidOperation: (State:String) [], RuntimeExcepti
on
+ FullyQualifiedErrorId : NullArray

Normal
[/more]

такой результат появляется при повторных запусках этого скрипта в одном окружении powershel ise. При первом запуске ошибок нет. Дело в том, что я не делал явную инициализацию переменных, поэтому в них оставались значения от предыдущего выполнения, что приводило к неправильной проверки условия в if. Решается легко, нужно добавить

Код:
$strID = $null
$strKey = $null
$strValue = $null
перед строкой:
$str -split "\n" | %{
Автор: MAVrADMIN
Дата сообщения: 23.01.2014 10:55
Ребят, подскажите плз по управлению ролью RDS в Windows 2012
Установлена и настроена роль "Remote Desktop Services", активирован режим "High Availability Mode"
Требуется скрипт для смены активного брокера подключений.

Нашел такое...

Код: import-module RemoteDesktop
$RDS_ACB = Get-RDConnectionBrokerHighAvailability
Автор: angeltwo
Дата сообщения: 23.01.2014 19:44
MAVrADMIN
Нет 2012 сервера, к сожалению.
Но начать надо с команды Get-Member, если гугл по Вашему вопросу ничего не выдает.
$RDS_ACB | gm - что выдает.
Но, эта переменная получена командой Get, а значит, все свойства в ней могут быть только для чтения. Значит нужно посмотреть. есть ли команда Set-RDConnectionBrokerHighAvailability ?

И гугл выдает нам пару ссылок
Set-RDConnectionBrokerHighAvailability
[no]Configure Remote Desktop Connection Broker in Windоws Server 2012 with SQL Server 2012 High Availability[/no]

Может это как-то поможет Вам.
Автор: MAVrADMIN
Дата сообщения: 24.01.2014 14:32
Нет, через Get-RDConnectionBrokerHighAvailability точно ничего не установить... это просмотр
Set-RDConnectionBrokerHighAvailability - там тоже ничего не установить... это создание HA-кластера(равно как и ваша вторая ссылка).

Моя задача - управлять уже созданным HA-брокером, а именно - переключать его активную ноду.
Можно конечно просто ребутнуть сервак... тогда по аларму все переключится... но хотелось бы сначала переключить, а уж затем ребутать.

На всякий случай приведу запрошенный Get-Member:
[more=Get-RDConnectionBrokerHighAvailability | Get-Member]

Код:
TypeName: Microsoft.RemoteDesktopServices.Common.RDCBHADetails

Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
ActiveManagementServer Property string ActiveManagementServer {get;}
ClientAccessName Property string ClientAccessName {get;}
ConnectionBroker Property string[] ConnectionBroker {get;}
DatabaseConnectionString Property string DatabaseConnectionString {get;}
DatabaseFilePath Property string DatabaseFilePath {get;}
Автор: aChikatillo
Дата сообщения: 29.01.2014 10:44
Добрый день! Есть PowerShell-скрипт по резервному копированию Hyper-v, Windows server 2008 R2,при выполнение скрипта появляется ошибка :
Исключение при вызове "Add" с "2" аргументами: "Ключ не может быть неопределенным.
Имя параметра: key"
C:\HVBACKUP\VM_Backup.ps1:148 знак:20
+ $VMList.add <<<< ($VM.ElementName, $State)

Вот сам скрипт:
[more=Код скрипта]

Код:
# Резервное копирования и ротация бэкапов для VM под управлением Hyper-V
# Минимальные требования для работы скрипта: PowerShell v2, Windows Server 2008.


# Функции, используемые в скрипте

# Функция для логирования
Function Write-Log ([string]$Message)
{
# Дата для вывода на экран
$strDate = Get-Date -Format "HH:mm:ss"

if ($script:LogPath)
{
# Создаем каталог для логов, если его нет
if (!(Test-Path $script:LogPath))
{
New-Item $script:LogPath -Type Directory | Out-Null
}

$FullLogPath = Join-Path $script:LogPath -ChildPath $script:LogFilename

# Пишем лог в файл
Write-Output "$strDate $Message" | Out-File -FilePath $FullLogPath -Append -Encoding Unicode
}

# Пишем лог в консоль
Write-Host "$strDate $Message"
}

# Функция отправки отчета на e-mail
function EmailNotification([string]$Sender, [string]$Receipt, [string]$Server, [boolean]$SSL = $False, [int]$Port = 25, [string]$Login, [string]$Password, [boolean]$TrustAnyCert = $False)
{
Write-Log "Отправляем отчет на $Receipt"

# Тема письма
$Object = $env:computername+": Отчет о резервном копировании VM от " + (Get-Date)

# Содержимое письма
$Content = Get-Content (Join-Path $script:LogPath -ChildPath $script:LogFilename) | Out-String
$SMTPclient = New-Object System.Net.Mail.SmtpClient $Server

# SMTP порт
$SMTPClient.Port = $Port

# SSL
if ($SSL)
{
# Устанавливаем режим SSL
$SMTPclient.EnableSsl = $SSL

# Отключаем проверку сертификатов, если наш почтовый сервер использует самоподписанный сертификат или он не установлен в системе.
if ($TrustAnyCert)
{
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$True}
}
}

# Если указан логин, инициализируем учетные данные SMTP-клиента
if ($Login)
{
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($Login, $Password)
}

# Создаем письмо
$Message = New-Object System.Net.Mail.MailMessage $Sender, $Receipt, $Object, $Content

# Тело письма будет в текстовом формате
$Message.IsBodyHtml = $False;

# Отправляем письмо
$SMTPclient.Send($Message)
}


# Функция, для определения относительного пути и его нормализации, если необходимо
Function NormalizePath ([string]$Path)
{
# Проверяем, относительный-ли путь
if ([System.IO.Path]::IsPathRooted($Path))
{
# Если нет, то ничего не делаем
$NormPath = $Path
} else
{
# Если путь относительный, то нормализуем его
$Path = Join-Path -Path $script:SDirPath -ChildPath $Path
$NormPath = [System.IO.Path]::GetFullPath($Path)
}

return $NormPath
}


# Функция, для установки путей
Function SetPaths
{
# Устанавливаем глобальные переменные

# Определяем путь, откуда запущен скрипт
$FullPath = $script:MyInvocation.MyCommand.Path

# Каталог скрипта
$script:SDirPath = Split-Path $FullPath

# Путь к файлу с настройками (ИмяСкрипта.ini)
$SBaseFileName = [System.IO.Path]::GetFileNameWithoutExtension($FullPath)
$script:SIniFile = Join-Path -Path $script:SDirPath -ChildPath $SBaseFileName".ini"

# Дата и время для имени лог-файла
$flDate = Get-Date -Format "dd-MM-yyyy_HH-mm-ss"

# Подкаталог для лог-файлов
$LogSubFolder = "Logs"

# Путь к лог-файлу
$script:LogPath = Join-Path -Path $script:SDirPath -ChildPath $LogSubFolder

# Имя лог-файла
$script:LogFilename = $SBaseFileName + "_" + $flDate + ".log"
Write-Log "Пишем лог в: $script:LogFilename"
}

# Функция для получения списка VM и их статусов
function GetVMs()
{
Write-Log "Получаем список VM"
# Запрос к WMI для получения списка VM.
# VM в переходных состояниях нас не интересуют.
$VMs = Get-WmiObject -Computername localhost -Namespace root\Virtualization -Query "Select * from MSVM_Computersystem where Description like'%Virtual%' AND (EnabledState = 2 OR EnabledState=3 OR EnabledState=32768 OR EnabledState=32769)"

# Пребразуем коды статусов в human-readable вид
foreach ($VM IN $VMs)
{
switch ($VM.EnabledState)
{
2{$State = "Running"}
3{$State = "Stopped"}
32768{$State = "Paused"}
32769{$State = "Suspended"}
32770 {$State = "Starting"}
32771{$State = "Taking Snapshot"}
32773{$State = "Saving"}
32774{$State = "Stopping"}
}

# Добавляем в хеш-таблицу
$VMList.add($VM.ElementName, $State)
Write-Log "$($VM.ElementName) ($State)"
}
# Возвращаем полученную таблицу
return $VMList
}

# Функция для запуска утилиты бэкапа
function LaunchEXE ($VMPath, $VMName)
{
Write-Log "Запускаем утилиту для бэкапа"
$VMBackupTime = Measure-Command {&$script:BackupExe --backup --outputformat "{0}_{2:dd-MM-yyyy_HH-mm-ss}.zip" --output "$VMPath" --list "$VMName"}
Write-Log "Бэкап $VMName занял $VMBackupTime"
}

# Функция ротации бэкапов
function DoRotation([string]$Path, [int]$MaxItems)
{
Write-Log "Начинаем ротацию"
# Выходим, если кол-во хранимых бэкапов равно 0
if (!$MaxItems)
{
Write-Log "Ротация отключена в настройках"
return
}

# Получаем список всех файлов с бэкапами, отсортированный по дате создания
$Items = @(Get-ChildItem -Path $Path\*) | Sort-Object -Property CreationTime

# Выходим, если бэкапов нет
if (!$Items)
{
Write-Log "Предыдущие бэкапы не найдены"
return
}

# Задаем параметры для цикла удаления
$NbrBackups = $Items.Count
$i = 0
Write-Log "Найдено предыдущих бэкапов: $NbrBackups"

# Удаляем старые бэкапы
while ($NbrBackups -ge $MaxItems)
{
Write-Log "Удаляем предыдущий бэкап $($Items[$i])"
$Items[$i] | Remove-Item -Force -Recurse -Confirm:$false
$NbrBackups -= 1
$i++
}
}

# Основная функция бэкапа
function DoBackup([hashtable]$VMList, [string]$BackupPath, [int]$MaxBackupsActive, [int]$MaxBackupsInactive, [bool]$LazyMode)
{
Write-Log "Начинаем бэкап"
# Получаем имя локального компьютера
$PCName = $env:computername

# Генерируем имя папки для бэкапа этого компьютера
$PCBackupPath = Join-Path -Path $BackupPath -ChildPath $PCName

# Ротация\бэкап для каждой VM в списке
foreach ($VM in $VMList.GetEnumerator())
{
# Генерируем имя папки для бэкапа этой VM
$VMBackupPath = Join-Path -Path $PCBackupPath -ChildPath $VM.Key
Write-Log "Бэкапим $($VM.Key) в папку $VMBackupPath"

# В зависимости от статуса VM
if ($VM.Value -eq "Running")
{
Write-Log "VM активна"
# Делаем ротацию бэкапов
DoRotation $VMBackupPath $MaxBackupsActive

# Создаем каталог, если его нет
if (!(Test-Path $VMBackupPath))
{
Write-Log "Отсутствует папка для бэкапа VM, создаем"
New-Item $VMBackupPath -Type Directory | Out-Null
}

#Запускаем утилиту для бэкапа
LaunchEXE $VMBackupPath $VM.Key
} else
{
Write-Log "VM не активна"
# А не ленимся ли мы?
if ($LazyMode)
{
Write-Log "Включен ленивый режим"
# Проверяем, есть ли бэкапы
$ExistingBackups = @(Get-ChildItem -Path $VMBackupPath\*)

# Нет? Сделаем один..
if (!$ExistingBackups.Count)
{
Write-Log "У данной VM нет ни одного бэкапа, делаем"
# Создаем каталог, если его нет
if (!(Test-Path $VMBackupPath))
{
Write-Log "Создаем папку для бэкапа VM"
New-Item $VMBackupPath -Type Directory | Out-Null
}

#Запускаем утилиту для бэкапа
LaunchEXE $VMBackupPath $VM.Key

} else {Write-Log "У данной VM уже есть бэкапы, ничего не делаем"}

} else
{
# Для неактивных VM делаем ротацию, только если не используется ленивый режим
DoRotation $VMBackupPath $MaxBackupsInactive

# Создаем каталог, если его нет
if (!(Test-Path $VMBackupPath))
{
Write-Log "Создаем папку для бэкапа VM"
New-Item $VMBackupPath -Type Directory | Out-Null
}

#Запускаем утилиту для бэкапа
LaunchEXE $VMBackupPath $VM.Key
}
}
}
}



# !! Начало скрипта !!

# Очищаем экран
Clear-Host

# Запускаем таймер для определения времени выполнения скрипта
$ElapsedTime = [System.Diagnostics.Stopwatch]::StartNew()

# Устанавливаем глобальный обработчик исключений
Trap
{
# Все критические ошибки в процессе работы будут записаны в лог
$TrapMessage = $error[0].ToString() + " " + $error[0].InvocationInfo.PositionMessage
Write-Log "$TrapMessage";Continue;
}

# Настраиваем пути для логов и файла настроек
SetPaths

# Загружаем и парсим файл настроек
Write-Log "Читаем настройки из: $script:SIniFile"
Get-Content $script:SIniFile | ForEach-Object -begin {$SSettings=@{}} -process { $k = [regex]::split($_,'='); if(($k[0].CompareTo("") -ne 0) -and ($k[0].StartsWith("[") -ne $True)) { $SSettings.Add($k[0], $k[1]) } }

# Путь к каталогу для бэкапов
[string]$BackupPath = $SSettings.Get_Item("BackupPath")
Write-Log "Путь к каталогу для бэкапов: $BackupPath"

# Путь к утилите для бэкапов, можно использовать относительные
$script:BackupExe = NormalizePath ($SSettings.Get_Item("BackupExe"))
Write-Log "Путь к утилите для бэкапов: $script:BackupExe"

# Кол-во хранимых бэкапов для активных VM. 0 - не удалять старые
[int]$MaxBackupsActive = $SSettings.Get_Item("MaxBackupsActive")
Write-Log "Кол-во хранимых бэкапов для активных VM: $MaxBackupsActive"

# Кол-во хранимых бэкапов для неактивных VM. 0 - не удалять старые
[int]$MaxBackupsInactive = $SSettings.Get_Item("MaxBackupsInactive")
Write-Log "Кол-во хранимых бэкапов для неактивных VM: $MaxBackupsInactive"

# Ленивый режим, бэкапит неактивные машины только в случае отсутствия бэкапов
# В PowerShell нельзя привести строковой 0 в boolean напрямую, используем специальную конструкцию
[boolean]$LazyMode = [System.Convert]::ToInt32($SSettings.Get_Item("LazyMode"))
Write-Log "Ленивый режим: $LazyMode"

# Посылать отчет на e-mail?
# В PowerShell нельзя привести строковой 0 в boolean напрямую, используем специальную конструкцию
[boolean]$SendEmail = [System.Convert]::ToInt32($SSettings.Get_Item("SendEmail"))
Write-Log "Посылать отчет на e-mail: $SendEmail"

# Создаем новую пустую хеш-таблицу
[hashtable]$VMList = @{}

# Получаем список VM со статусами
$VMList = GetVMs

# Запускаем бэкап
DoBackup $VMList $BackupPath $MaxBackupsActive $MaxBackupsInactive $LazyMode

# Бэкап окончен
Write-Log "Общее время выполнения: $($ElapsedTime.Elapsed.ToString())"

# Проверяем, включена-ли отправка отчетов на e-mail
if ($SendEmail)
{
# Устанавливаем параметры для отчета на e-mail

# Адрес отправителя
[string]$Sender = $SSettings.Get_Item("Sender")

# Адрес получателя
[string]$Receipt = $SSettings.Get_Item("Receipt")

# SMTP сервер
[string]$Server = $SSettings.Get_Item("Server")

# SMTP порт
[int]$Port = $SSettings.Get_Item("Port")

# SSL
# В PowerShell нельзя привести строковой 0 в boolean напрямую, используем специальную конструкцию
[boolean]$SSL = [System.Convert]::ToInt32($SSettings.Get_Item("SSL"))
[boolean]$TrustAnyCert = [System.Convert]::ToInt32($SSettings.Get_Item("TrustAnyCert"))

# Логин
[string]$Login = $SSettings.Get_Item("Login")

# Пароль
[string]$Password = $SSettings.Get_Item("Password")

Write-Log "Отчет на e-mail будет отправлен с $Sender на $Receipt через $Server"
Write-Log "SSL: $SSL, Игнорировать ошибки сертификатов: $TrustAnyCert, Порт: $Port, Логин: $Login)"

# Отсылаем отчет на e-mail
EmailNotification $Sender $Receipt $Server $SSL $Port $Login $Password $TrustAnyCert
}
Автор: ia medved
Дата сообщения: 14.03.2014 16:04
Добрый день коллеги.
Первый раз сел за PS
С программированием очень туго.
Нужно или из вывода команды или если слить вывод в текстовый файл выбрать указанные символы в указанной строке. Подскажите как это сделать?

Пример: вывод команды

Код: E:\>defrag c: /A /u
Оптимизация диска (Майкрософт)
(c) Корпорация Майкрософт (Microsoft Corporation), 2013.
Вызов анализ на (C...
Анализ: выполнено на 100%.
Операция успешно завершена.
Post Defragmentation Report:
Сведения о томе:
Размер тома = 161,69 ГБ
Свободное место = 114,36 ГБ
Общий объем фрагментированного пространства = 0%
Максимальный размер свободного места = 56,82 ГБ
Примечание. В статистику фрагментации не включаются фрагменты файлов, ра
змер которых превышает 64 МБ.
Дефрагментация этого тома не требуется.
Автор: gmax007
Дата сообщения: 18.03.2014 14:05
Подскажите пожалуйста как проверить статус службы и запустить ее если остановлена, не знаю какие типы данных выдают команды и как все это дело обработать в условии
Какое значение в выводе команды get-service name | where {$_.status -eq 'stopped'}, если служба name запущена, null или пустая строка. Как условие написать, если вывод команды засунуть в переменную
Автор: KapralBel
Дата сообщения: 18.03.2014 14:31
gmax007

Цитата:
Как условие написать, если вывод команды засунуть в переменную


Код: $a=(get-service <name> | where {$_.status -eq 'stopped'}).Service
Автор: gmax007
Дата сообщения: 18.03.2014 15:36
Спасибо, тут же объектно все а я про null и пустые строки думаю , стало понятней
Автор: KapralBel
Дата сообщения: 18.03.2014 16:32
gmax007
А еще проще


Код: Get-Service Alerter | Start-Service
Автор: aftertime
Дата сообщения: 20.03.2014 21:01
Всем привет! Передо мной стоит следующая задача - имея ссылку на страничку в интернете проанализировать ее содержимое, скачать и сконвертировать в другой формат одну картинку (имя каждый раз разное, но есть характерные приметы), а так же скачать трейлер с ютуба. Картинку и клип положить в созданную папку. Исходная ссылка всегда имеет вид: http://www.luxorfilm.ru/film/хххх/названиефильма/ Где хххх - четыре цифры. Именно их нужно использовать в качестве имени для папки.

1 скрипт принимает ссылку как аргумент и создает папку из части этой ссылки. Каждый раз ссылка содержит четыре цифры, их и нужно взять в качестве имени
2 скачивает html файл по ссылке
3 читает содержимое файла и выцепляет две ссылки:
- одна на картинку
- одна на ролик на ютубе
4 конвертирует каринку в нужный формат
5 скачивает видео с ютуба
6 складывает результаты шагов 4 и 5 в папку, созданную на шаге 1

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

Что получилось:
1 скачать файл, получить из него части текста содержащие нужные значения
2 сконвертировать файл в нужный формат
3 скачать клип с ютуба

Под катом результат моих трудов

[more=скачиваем файл и ищем строки]
пример запуска: имяскрипта.ps1 http://www.luxorfilm.ru/film/2161/Rio-2/
$source = "$args[0]#.Length"
$file = "film.html"
$wc = New-Object System.Net.WebClient
$wc.DownloadFile($source, $file)
Select-String "http://www.luxorfilm.ru/upload/movies/" film.html
Select-String "youtu" film.html
[/more]

[more=скачиваем и конвертируем картинку]
$source = "http://www.luxorfilm.ru/upload/movies/2161/1000_rio2.jpg"
$destination = "poster.jpg"
$wc = New-Object System.Net.WebClient
$wc.DownloadFile($source, $destination)
$sourceFile = "poster.jpg"
$saveFile = "poster.png"
Add-Type -AssemblyName system.drawing
$imageFormat = "System.Drawing.Imaging.ImageFormat" -as [type]
$image = [drawing.image]::FromFile($sourceFile)
$image.Save($saveFile, $imageFormat::png)
[/more]

[more=скачиваем трейлер (используется youtube-dl. пока не переписал на PS)]
пример запуска:
имяскрипа www.youtube.com/embed/2IZhz_0rwz4
echo off
set arg1=%1
youtube-dl.exe -o trailer.flv %arg1%
[/more]
Автор: HumpSoft
Дата сообщения: 24.03.2014 08:42

Цитата:
1 скрипт принимает ссылку как аргумент и создает папку из части этой ссылки. Каждый раз ссылка содержит четыре цифры, их и нужно взять в качестве имени

$p=('http://www.luxorfilm.ru/film/2161/Rio-2/' -split '/')[4]

сойдет ?
Автор: aftertime
Дата сообщения: 24.03.2014 09:08

Цитата:
сойдет ?

даже очень. теперь конструкция выглядит так:

Код: $source = "$args[0]#.Length"
$dir = ("$args[0]#.Length" -split '/')[4]
New-Item -ItemType Directory $dir
Автор: HumpSoft
Дата сообщения: 24.03.2014 12:58
$sss=Select-String "http://www.luxorfilm.ru/upload/movies/" film.html
$sss -match "(http://www.luxorfilm.ru/upload/movies/\d{1,}/\w{1,}.\w{1,})"
$pic_url=$matches[0]

Страницы: 123456789101112131415161718192021222324

Предыдущая тема: Не понятная проблема с видеокартой.


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.