Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Windows PowerShell 1.x/2.x/CTP

Автор: angeltwo
Дата сообщения: 01.11.2013 07:43
mikel23
Как-то так:

Код:
$NextNumberFile = 0
(Get-ChildItem d:\Folder\*.zip) | %{if ($_.BaseName) {$NextNumberFile = $_.BaseName}}
"{0:D3}" -f (([System.Convert]::ToInt32($NextNumberFile))+1)
Автор: mikel23
Дата сообщения: 01.11.2013 08:03
Я использовал
(Get-ChildItem D:\folder).count

Все равно спасибо.

Добавлено:
Добрый день.
Нужно скопировать файлы по сети на \\computername\c$\folder
copy-item как я понял не поддерживает аунтификацию
copy-item d:\file -destination \\computername\c$\folder -Credential("dom\administrator","123456")
так не работает

Как можно иначе через net use?Как то не хочется.
Автор: Rusell
Дата сообщения: 23.01.2014 14:52
Приветствую форумчане, обращаюсь за помощью. Ситуация следующая:
Имеем домен Active Directory на Windows 2003 + Secondary Domain Controller 2008R2 (который вскоре станет основным контроллером, а первый обновим до 2008R2).
Используя PowerShell необходимо реализовать создание каталогов для пользователей домена с последующей выдачей прав.
Как то так:
\\fileserver\$Group - папка OU с наименованием отдела

\\fileserver\$Group\$User (выводимое имя, Иванов Виконтий Адольфович)
В корне этой папки файлы создавать нельзя никому
\\fileserver\$Group\$User\!Просмотр
Просматривать файлы может любой сотрудник. Создавать, изменять и удалять только владелец
\\fileserver\$Group\$User\!Редактирование
Создавать, просматривать, изменять и удалять файлы может любой сотрудник
\\fileserver\$Group\$User\!Личная
Недоступна для прочих пользователей. Создавать, просматривать, изменять и удалять файлы может только владелец-сотрудник.

Пока накидал следующее но не работает, завтра буду перелопачивать

Код:
cls
Import-Module ActiveDirectory
$Dir = "D:\Users"

$Groups = Get-ADGroup -Filter * -SearchBase "DC=domain,DC=ru" | ft name

foreach ($Group in $Groups )
    {
$Users = Get-ADGroupMember $Group
foreach ($User in $Users)
        {
        $Path = New-Item -ItemType Directory -Path $Dir -Name $User
        $Args = New-Object system.security.accesscontrol.filesystemaccessrule($User,"Modify, Synchronize", "ContainerInherit, ObjectInherit", "None", "Allow")
        $ACL = Get-Acl $Path
        $ACL.SetAccessRule($Args)
        Set-Acl $Path $ACL

        }
    }
Автор: aChikatillo
Дата сообщения: 24.01.2014 15:56
Добрый день! Есть 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
}
Автор: Syllion
Дата сообщения: 28.01.2014 14:51
Кстати, вот хорошая дискуссия на тему сравнения PowerShell c Bash. Есть много примеров. Может кому пригодится http://linexp.ru/forum/896-bash-vs-cmd-vs-powershell
Автор: Vadimus3000
Дата сообщения: 04.02.2014 20:39
Добрый день!
Появилась такая задачка:
Необходим Отчёт Службы удаленных рабочих столов Windows 2008 R2
Сделать отчёт в виде скрипта на Power Shell, VBS, Microsoft Log Parser. Таблица кто логинился и отключался из Remote Desktop. Отчёт должен создаваться из логов, которые находятся в
Диспетчер сервера -> Журналы приложений -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Microsoft-Windows-TerminalServices-LocalSessionManager/Operational
На выходе должна получиться табличка со столбцами:
Time, Username, Computer name, IP address, Logon/Logoff

Аудит включаться на сервере не должен. Необходимо брать логи именно из вышеупомянутого места

Буду благодарен за помощь
Автор: mikel23
Дата сообщения: 02.04.2014 07:22
Помогите пожалуйста
Не могу дойти как сделать.
есть две папки c:\in и c:\out
В IN лежат файлики: 1111.txt
2212.txt
3333.txt
4414.txt
Нужно скопировать из IN только те файлы у которых третий символ имени "1" и скопировать в OUT отрезая первые три символа.
Получиться должно что бы в OUT лежали 11.txt
12.txt
14.txt
Substring(3,0) - он работает только со строкой а я получаю
foreach
($file in Get-ChildItem c:\in\*1* )

$file System.IO.FileInfo

Помогите пожалуйста.
Автор: KapralBel
Дата сообщения: 02.04.2014 10:56

Цитата:
foreach ($file in Get-ChildItem d:\in\*1* ) {$file.name}


Добавлено:
А еще более удобно
foreach ($file in Get-ChildItem d:\in\??1* ) {$file.name}
Автор: muxa81
Дата сообщения: 02.06.2014 11:44
Здравствуйте уважаемые гуру скриптинга на powershell!

помогите с задачей:

есть скрипт


Код:
################################################################################
# Send E-mail from eml file in PowerShell
# Tested on PowerShell 2.0
#
# Usage:
# 1. Configure the variables defined in Main()
# $server = "localhost"
# $port = "25"
# $mailfrom = "from@example.com"
# $rcptto = "to@example.com"
# $filename = "test.eml"
#
# 2. Run the script in PowerShell
#
################################################################################

$encoding = New-Object System.Text.AsciiEncoding

Function SendCommand($stream, $writer, $command) {
# Send command
    foreach ($line in $command) {
        $writer.WriteLine($line)
    }
    $writer.Flush()
    Start-Sleep -m 100

    # Get response
    $buff = New-Object System.Byte[] 4096
    $output = ""
    while ($True) {
        $size = $stream.Read($buff, 0, $buff.Length)
        if ($size -gt 0) {
            $output += $encoding.GetString($buff, 0, $size)
        }
        if (($size -lt $buff.Length) -or ($size -le 0)) {
            break
        }
    }

    if ([int]::Parse($output[0]) -gt 3) {
        throw $output
    }
    $output
}

Function SendMessage($server, $port, $mailfrom, $rcptto, $filename) {
    try {
        $socket = New-Object System.Net.Sockets.TcpClient($server, $port)
        $stream = $socket.GetStream()
        $stream.ReadTimeout = 1000
        $writer = New-Object System.IO.StreamWriter $stream

        $endOfMessage = "`r`n."

        SendCommand $stream $writer ("EHLO " + $server)
        SendCommand $stream $writer ("MAIL FROM: <" + $mailfrom + ">")
        SendCommand $stream $writer ("RCPT TO: <" + $rcptto + ">")
        SendCommand $stream $writer "DATA"
        $content = (Get-Content $filename) -join "`r`n"
        SendCommand $stream $writer ($content + $endOfMessage)
        SendCommand $stream $writer "QUIT"
    }
    catch [Exception] {
        Write-Host $Error[0]
    }
    finally {
        if ($writer -ne $Null) {
            $writer.Close()
        }
        if ($socket -ne $Null) {
            $socket.Close()
        }
    }
}

Function Main() {
    $server = "emailserver.com"
    $port = "25"
    $mailfrom = "from-some@mail.ru"
    $rcptto = "to-some@email.ru"
    $include = @('*.eml')
    $filename = Get-ChildItem "C:\emlfiles\" -Recurse -Include $include
        
        SendMessage $server $port $mailfrom $rcptto $filename
    
            
}

Main | Out-Null

Автор: Vadimus3000
Дата сообщения: 22.09.2014 16:15
Всем привет!
Такая вот задача:
Необходимо вытащить из логов имя создаваемого в AD пользователя.
Взять все эти события можно командой:
Get-EventLog –LogName Security –InstanceID 4720
Теперь вопрос, как взять имя созданного пользователя из последнего события?
Это нужно, что бы потом отправить это имя в качестве параметра к другому скрипту.

Заранее спасибо за помощь!
Автор: VovaMozg
Дата сообщения: 02.10.2014 06:14
Vadimus3000
$Events = Get-WinEvent -FilterHashtable @{Logname='Security';Id=4720}
foreach ($event in $Events){$Event =[xml]$Event.ToXml(); $event.Event.EventData.data[8]}

8 - SamAccountName
9 - DisplayName
10 - UserPrincipalName
Автор: Vadimus3000
Дата сообщения: 02.10.2014 09:26
Спасибо!
На данный момент у меня получился вот такой скрипт:

$Event=Get-EventLog -LogName Security -InstanceId 4720 | Select-Object -First 1 | fl -Property Message | find "SAM Account Name:"
$user=$Event -replace " SAM Account Name: "
Автор: VovaMozg
Дата сообщения: 02.10.2014 18:21
Vadimus3000
Тогда уж find заменить на select-string
имхо с xml удобнее работать - получаешь все свойства именно как свойства объекта, а не как большой стринг.
Но ведь главное, чоб задача выполнялась
Автор: Mosl
Дата сообщения: 31.10.2014 12:33
Написал скрипт на powershell для создания бекапа:

Код:
Add-PSSnapin Windows.ServerBackup
$pol = new-wbpolicy
$disk = get-wbdisk | where {$_.disknumber -eq 2}
$target = new-wbbackuptarget -disk $disk -Label "Backup Dogovora"
$source1 = new-wbfilespec -filespec "G:\Входящие договора"
$source1 | add-wbfilespec -policy $pol
add-wbbackuptarget -policy $pol -target $target
Start-WBBackup –Policy $pol
Автор: Odarchuk
Дата сообщения: 21.11.2014 11:54
Есть AD и VPN построенный на Cisco. Они "дружат" между собой и если у юзера активирован Network Access Permison на вкладке Dial-In (скрин http://joxi.ru/8An0vjOcqXKzmO ) то он может пользоваться ВПНом используя свой доменный логин/пароль.

Но вся соль в том что ВПН разрешается только на определенное время: день/неделя/декада/месяц.
Нужно автоматизировать прекращение доступа к ВПН.
Как я это вижу:
1) создается новый атрибут (или используется существующий) в котором указывается срок действия ВПН
2) При активации ВПНа пользователь добавляется в группу VPN
3) каждый день запускается скрипт который:
а) получает список юзеров группы VPN
б) проверяет каждого юзера и получает значение данного атрибута
в) если атрибут = сегодняшней дате то скрипт меняет значение Network Access Permison и удаляет юзера из группы

4) как опция: шлет мыло со списком удаленных юзеров.

Кто-то встречал пододбные скрипты??
Автор: unreal666
Дата сообщения: 17.04.2015 13:33
Несколько вопросов.

- как для Get-Content указать кодировку считываемого файла?
- какая есть команда (или чем она там является) типа -replace, но читающую файл не построчно, а как "непрерывный", чтобы можно было в качестве поиска для замены указать что-то типа "^[a-z]+\r?\n" ?
Автор: hydromarine666
Дата сообщения: 05.08.2015 11:25
Здравствуйте.
Прошу помощи в этой теме http://forum.ru-board.com/topic.cgi?forum=33&topic=14331#1
Автор: NeoAnomaly
Дата сообщения: 05.08.2015 14:48

Цитата:
- как для Get-Content указать кодировку считываемого файла?

Get-Content для FileSystem провайдера имеет параметр Encoding.


Цитата:
- какая есть команда (или чем она там является) типа -replace, но читающую файл не построчно, а как "непрерывный"

Заключи Get-Content в скобки (Get-Content my.txt) | Foreach-Object {$_ -replace <params> } | ...
и тогда контент в pipeline будет уходить не построчно, а после полного чтения.
Автор: zerbino
Дата сообщения: 14.09.2015 22:03
Приветствую, уважаемые. Подскажите пожалуйста по такому моменту.
В cmd выполняется следующая команда для поиска определенных обновлений - в данном случае KB2923545, но можно через запятую указать любые требуемые

Код: powershell get-hotfix -id KB2923545,KB2970228
Автор: iNNOKENTIY21
Дата сообщения: 15.09.2015 08:29
а где код скрипта или хотя бы часть, генерирующая ошибку?
если я правильно понял...
[more=$LastExitCode, Exit, $?]Error {1} <<<< | PowerShell и другие скрипты
Цитата:

$LastExitCode. Но конечно следует помнить что это значение возвращается обычно только внешними утилитами командной строки (и то не всеми к сожалению), и иногда скриптами PowerShell, если выход из скрипта осуществляется с помощью команды Exit (которой в качестве аргумента как раз можно указать этот exit code). Но тем не менее переменная всё же остаётся полезной, и весьма часто.

PS> ping.exe ya.ru -n 1 | out-null; if ($LASTEXITCODE -eq 0) {"Хост отвечает"} else {"Ошибка"}
Хост отвечает
PS> ping.exe nonexistant.host -n 1 | out-null; if ($LASTEXITCODE -eq 0) {"Хост отвечает"} else {"Ошибка"}
Ошибка

В случае если вы работаете с командами PowerShell, гораздо более полезной будет переменная $? (знак вопроса). Это boolean переменная, которая сообщает нам успешно ли выполнилась последняя команда ($True) или при выполнении произошли ошибки ($False).

PS> Get-Process explorer

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
713 32 36244 37892 268 33,26 3684 explorer

PS> $?
True
PS> Get-Process nonexistantProcess
Get-Process : Cannot find a process with the name 'nonexistantProcess'. Verify the process name and call the cmdlet again.
At line:1 char:12
+ Get-Process <<<< nonexistantProcess
PS> $?
False

Учтите, $? относится именно к успешности последней команды PowerShell, и вовсе не заменяет $LastExitCode. Если посмотреть её значение после выполнения например ping.exe nonexistant.host -n 1 то оно будет равно $True, ведь с точки зрения PowerShell, команда была выполнена успешно — ping.exe запустился. А уж что за проблемы у него возникли, волнует только переменную $LastExitCode
[/more]
Автор: Scaramanga
Дата сообщения: 16.09.2015 18:09
Доброго времени суток.


Есть две папки

В первой содержится n-ое кол-во папок, вторая изначально пустая.

Стоит следующая задача.Чтобы при запуске скриптаво второй папке появлялись симлинки на все папки из первой(с теми же именами) и соответственно при удалении из первой-пропадали симлинки

Заранее спасибо
Автор: iNNOKENTIY21
Дата сообщения: 17.09.2015 10:31
Scaramanga
а, что не получается? на чём застрял?

какую задачу таким способом решаешь?
например для бекапа на симлинках есть прожка
Автор: zerbino
Дата сообщения: 19.09.2015 03:43

Цитата:
а где код скрипта или хотя бы часть, генерирующая ошибку?
если я правильно понял...


Спасибо за ответ.. Так мой вопрос как раз в том, как реализовать это.. Мои попытки не увенчались успехом.

Сейчас скрипт выглядит так. Я его хочу подшаманить для удаления спай патчей от M$.

[more=win7spy_delete.cmd]

Код:
@echo off
color 0E
echo Removing Windows 7 and 8.1 spyware updates.
echo To remove "spyware" updates open Command Prompt as Administrator by clicking
echo right mouse button.
echo Sometimes you need to run this file several times till "get-hotfix" no longer
echo find spyware updates (for ex. KB2952664 and others).
echo Created by Zerbino, thanks to ru-board, hackread.com, ghacks.net and Google.

echo DETECTING INSTALLED "SPYWARE" UPDATES
echo =============================================================================
powershell get-hotfix -id KB2923545,KB2970228,KB2592687,KB3035583,KB2660075,KB2506928,KB2726535,KB2994023,KB2545698,KB2976978,KB3075249,KB3080149,KB3021917,KB3022345,KB3068708,KB3044374,KB3035583,KB2990214,KB2952664,KB3075853,KB3065987,KB3050265,KB3075851,KB3083324
echo =============================================================================
echo IF RED STRINGS PRESENT YOU CAN CLOSE THIS SCRIPT
echo THERE IS NOT SPYWARE UPDATES
echo or
echo PRESS ANY KEY TO START REMOVING "SPYWARE" UPDATES
pause

echo Delete KB2923545 RDP 8.1(custom by https://www.hackread.com/microsoft-updates-spy-on-windows7-8-users/)
start /w wusa.exe /uninstall /kb:2923545 /quiet /norestart

echo Delete KB2970228 (custom by https://www.hackread.com/microsoft-updates-spy-on-windows7-8-users/)
start /w wusa.exe /uninstall /kb:2970228 /quiet /norestart

echo Delete KB2592687 (custom by https://www.hackread.com/microsoft-updates-spy-on-windows7-8-users/)
start /w wusa.exe /uninstall /kb:2592687 /quiet /norestart

echo Delete KB2660075 (custom by https://www.hackread.com/microsoft-updates-spy-on-windows7-8-users/)
start /w wusa.exe /uninstall /kb:2660075 /quiet /norestart

echo Delete KB2506928 (custom by https://www.hackread.com/microsoft-updates-spy-on-windows7-8-users/)
start /w wusa.exe /uninstall /kb:2506928 /quiet /norestart

echo Delete KB2726535 (custom by https://www.hackread.com/microsoft-updates-spy-on-windows7-8-users/)
start /w wusa.exe /uninstall /kb:2726535 /quiet /norestart

echo Delete KB2994023 (custom by https://www.hackread.com/microsoft-updates-spy-on-windows7-8-users/)
start /w wusa.exe /uninstall /kb:2994023 /quiet /norestart

echo Delete KB2545698 IE9 (custom by https://www.hackread.com/microsoft-updates-spy-on-windows7-8-users/)
start /w wusa.exe /uninstall /kb:2545698 /quiet /norestart

echo Delete KB2976978 (telemetry for Win8/8.1)
start /w wusa.exe /uninstall /kb:2976978 /quiet /norestart

echo Delete KB3075249 (telemetry for Win7/8.1)
start /w wusa.exe /uninstall /kb:3075249 /quiet /norestart

echo Delete KB3080149 (telemetry for Win7/8.1)
start /w wusa.exe /uninstall /kb:3080149 /quiet /norestart

echo Delete KB3021917 (telemetry for Win7)
start /w wusa.exe /uninstall /kb:3021917 /quiet /norestart

echo Delete KB3022345 (telemetry)
start /w wusa.exe /uninstall /kb:3022345 /quiet /norestart

echo Delete KB3068708 (telemetry)
start /w wusa.exe /uninstall /kb:3068708 /quiet /norestart

echo Delete KB3044374 (Get Windows 10 for Win8.1)
start /w wusa.exe /uninstall /kb:3044374 /quiet /norestart

echo Delete KB3035583 (Get Windows 10 for Win7sp1/8.1)
start /w wusa.exe /uninstall /kb:3035583 /quiet /norestart

echo Delete KB2990214 (Get Windows 10 for Win7 without sp1)
start /w wusa.exe /uninstall /kb:2990214 /quiet /norestart

echo Delete KB2952664 (Get Windows 10 assistant)
start /w wusa.exe /uninstall /kb:2952664 /quiet /norestart

echo Delete KB3075853 (update for "Windows Update" on Win8.1/Server 2012R2)
start /w wusa.exe /uninstall /kb:3075853 /quiet /norestart

echo Delete KB3065987 (update for "Windows Update" on Win7/Server 2008R2)
start /w wusa.exe /uninstall /kb:3065987 /quiet /norestart

echo Delete KB3050265 (update for "Windows Update" on Win7)
start /w wusa.exe /uninstall /kb:3050265 /quiet /norestart

echo Delete KB3075851 (update for "Windows Update" on Win7)
start /w wusa.exe /uninstall /kb:3075851 /quiet /norestart

echo Delete KB3083324 (update for "Windows Update" on Win7 replaces KB3075851)
start /w wusa.exe /uninstall /kb:3083324 /quiet /norestart

echo ALL DONE. NOW YOU CAN CLOSE WINDOW.
pause
Автор: iNNOKENTIY21
Дата сообщения: 19.09.2015 09:31
zerbino у тебя же cmd батник, а они там: Командная строка, батники, сценарии (bat, cmd) список хотфиксов можно и без powershell получить.
[more=а на powershell как то так:]
Код: # Получить список установленных обновлений
$HotFixInstalled = Get-Hotfix

# Список шпионящих обновлений
[string[]]$SpyHotFix = "KB2923545","KB2970228","KB2592687","KB3035583","KB2660075","KB2506928","KB2726535","KB2994023","KB2545698","KB2976978","KB3075249","KB3080149","KB3021917","KB3022345","KB3068708","KB3044374","KB3035583","KB2990214","KB2952664","KB3075853","KB3065987","KB3050265","KB3075851","KB3083324"

# Вывод на консоль желтым количества установленых обновлений
Write-Host -ForegroundColor Yellow "Installed updates count:" $HotFixInstalled.Count

# Перебор шпионящих обновлений
foreach($id in $SpyHotFix)
{
# если в списке установленных HotFixID = id из списка шпионящих
if ($HotFixInstalled.HotFixID -eq "$id")
{
# вывод на консоль, что хотфикс установлен
Write-Host "Update $id installed"

# еще какие нибудь команды...
}
# иначе
else
{
# вывод на консоль красным, что хотфикс не установлен
Write-Host -ForegroundColor Red "Update $id NOT installed"

# еще какие нибудь команды...
}
}

pause
Автор: zerbino
Дата сообщения: 19.09.2015 13:50
iNNOKENTIY21
Ну я могу отличить одно от другого) Просто батником хотелось обойтись, потому как PS не у всех может быть установлен. Ну и ладно, что все отработают строки, а вот если есть, то было бы хорошо, чтобы всё отработало красиво
Спасибо за помощь
Автор: mila22
Дата сообщения: 30.09.2015 15:42
Коллеги, нужна небольшая помощь. че не могу сообразить что не так. есть небольшой скрипт и при выполнении его получаем ошибку

Код:
$serv=C:\temp\server.txt
Invoke-Command -ComputerName $serv -ScriptBlock {
wmic product get name } | Out-File D:\temp\test.txt -Append
Автор: iNNOKENTIY21
Дата сообщения: 30.09.2015 22:52

Цитата:
Коллеги, нужна небольшая помощь. че не могу сообразить что не так. есть небольшой скрипт и при выполнении его получаем ошибку


$serv=C:\temp\server.txt
получается:
Invoke-Command -ComputerName C:\temp\server.txt

$serv=правильное имя
или получить содержимое файла см. Get-Content,
если не один серв в server.txt,
то цикл см. foreach


Код: $servera=Get-Content C:\temp\server.txt
foreach($server in $servera)
{
Invoke-Command -ComputerName $serv -ScriptBlock { wmic product get name } | Out-File D:\temp\test.txt -Append
}
Автор: mila22
Дата сообщения: 01.10.2015 17:43
да , пришлось использовать get-content.
Автор: daMIR
Дата сообщения: 12.10.2015 09:47
Прошу помощи. Дублирую отсюда http://forum.ru-board.com/topic.cgi?forum=8&bm=1&topic=53329#1

Всем привет!

Нашел в гугле код (выводит список пользователей, которые давно не логинились):

Код:
# Блок переменных
# $LDAPPath – ADSI путь к контейнеру с учетными записями пользователей и компьютеров (в формате LDAP://distinguishedName)
# $Mode - Режим поиска учетных записей (1 - Пользователи, 2 - Компьютеры)
# $CountDisabled – Признак необходимости обработки отключенных учетных записей (1 или 0)
# $LastLogonAgeDaysLimit - Количество дней прошедших с момента последнего входа в систему
#
$LDAPPath = 'LDAP://OU=Accounts,DC=holding,DC=com'
$Mode = 1
$CountDisabled = 0
$LastLogonAgeDaysLimit = 90
#
# Блок поиска
#
$RootDomainOU = [ADSI]$LDAPPath
$Searcher = New-Object System.DirectoryServices.DirectorySearcher($RootDomainOU)
If ($Mode -eq 1) {$Filter = '(objectCategory=person)(objectClass=user)'}
ElseIf ($Mode -eq 2) {$Filter = '(objectCategory=computer)'}
If ($CountDisabled -eq 0) {$Filter = $Filter + '(!(userAccountControl:1.2.840.113556.1.4.803:=2))'}
$Filter = '(&' + $Filter + ')'
$Searcher.Filter = $Filter
$Searcher.PageSize = 5000
[Void]$Searcher.PropertiesToLoad.Add('cn')
[Void]$Searcher.PropertiesToLoad.Add('sAMAccountName')
[Void]$Searcher.PropertiesToLoad.Add('description')
[Void]$Searcher.PropertiesToLoad.Add('lastLogonTimestamp')
$Objects = $Searcher.findall()
#
# Блок основного вывода
#
$LLDays = (Get-Date).AddDays(-$LastLogonAgeDaysLimit).ToFileTime()
$OldObjects = $Objects | Where-Object {$_.properties.lastlogontimestamp -le $LLDays}
$OldObjects | Select `
@{label='Object Name';expression={$_.properties.cn}},`
@{label='sAMAccountName';expression={$_.properties.samaccountname}},`
@{label='Last Logon Timestamp';expression={[datetime]::FromFileTime(($_.properties.lastlogontimestamp)[0])}},`
@{label='Description';expression={$_.properties.description}}`
| Sort -Property 'Last Logon Timestamp'`
| Format-Table –AutoSize
Write-Host '---------------------------------------------------'
write-host 'Domain accounts in OU:' $Objects.Count
write-host 'Domain accounts with old lastLogonTimestamp:' $OldObjects.Count
Write-Host '---------------------------------------------------'
Автор: tolyn77
Дата сообщения: 14.10.2015 09:16
здравствуйте

на просторах интернета нашел такой скрипт

Код: Get-ChildItem -Recurse -Path c:\windows\temp | where {-not $_.PSIsContainer} | select FullName, length, @{Name="Owner";Expression={(Get-ACL $_.fullname).Owner}}, Name

Страницы: 1234567

Предыдущая тема: Assembler


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