Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Активные темы » Сценарии для Windows

Модерирует : KLASS, IFkO

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

Открыть новую тему     Написать ответ в эту тему

KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Старые и смежные темы: по CMD и в Программах | по PowerShell | В помощь системному администратору | Прикладное программирование

PowerShell
Версии | Ассоциация и подпись сценариев
Сценарий для ассоциации файлов PowerShell и запуска неподписанных скриптов.
 
Прочее
Расширение возможностей
Функции
Write-Color
Output-DebugString
Провайдеры
Готовые скрипты
Полезные ссылки | Будет ли репозиторий PowerShell на ru-board?
Книги в PDF
Cheat Sheets
 

Cmd
Для перекодирования кириллицы 866<—>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы
 
Готовые решения и частые вопросы
 
Описания работы команд и символов участниками темы:
setlocal enabledelayedexpansion и переменные окружения
символы & и && в командной строке
Переменная %0
 
Полезные ссылки и утилиты

WSH (VBScript, JScript)
Программирование "удобняшек" на VBScript

Примечания:
• Большие куски кода заключайте в тэг [ more ]
• Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте код без пробелов иначе сценарий может работать неправильно. Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
• Сторонние консольные утилиты можно использовать только в виде готового решения и только в рамках сценариев. Никаких обсуждений и обучений работе с утилитами не предусмотрено и прямо запрещено правилами топика.
Шапка и около-темные вопросы |

Всего записей: 11062 | Зарегистр. 12-10-2001 | Отправлено: 13:40 17-02-2018 | Исправлено: YuS 2, 08:24 19-06-2021
mat86



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21 спасибо большое, onedrive тоже самое, а вот еще кучу всего нужного от farag почерпнул

Всего записей: 438 | Зарегистр. 19-03-2009 | Отправлено: 02:35 10-06-2019
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
Но боюсь, там тоже /uninstall но с добавками

По-другому и никак...

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 08:24 10-06-2019
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
 
$ProductName = @{
    Name = "ProductName"
    Expression = {"$($_.ProductName) $($_.ReleaseId) $Channel"}
}
$Build = @{
    Name = "Build"
    Expression = {"$($_.CurrentMajorVersionNumber).$($_.CurrentMinorVersionNumber).$($_.CurrentBuild).$($_.UBR)"}
}
(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" | Select-Object -Property $ProductName, $Build | Format-Table | Out-String).Trim()
$InstallDate = @{
    Name = "Install Date"
    Expression={$_.InstallDate}
}
$Arch = @{
    Name = "Architecture"
    Expression = {$_.OSArchitecture}
}
(Get-CimInstance -ClassName CIM_OperatingSystem | Select-Object -Property $InstallDate, $Arch | Format-Table | Out-String).Trim()
 

 
Можно без сторонних модулей совместить эти две таблички в одну?

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 14:26 10-06-2019 | Исправлено: farag, 14:26 10-06-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
farag
 
Можно, если не заниматься ерундой с форматированием и аутстринг в конце труб
 

Код:

$a = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" | Select-Object -Property $ProductName,$Build)  
 
$b = (Get-CimInstance -ClassName CIM_OperatingSystem | Select-Object -Property $InstallDate, $Arch)  
 
[PSCustomObject]@{
    PrName = $a.ProductName
    Build = $a.Build
    InDate = $b.'Install Date'
    Arch = $b.Architecture
}

 
Форматировать можно только самый последний результат, вот бери этот объект и форматируй если надо выдать красиво
Если надо где-то ещё использовать - используй без форматирования.
 

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 14:41 10-06-2019 | Исправлено: LevT, 14:46 10-06-2019
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Пошел учить про PSCustomObject...

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 14:57 10-06-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
farag

Цитата:
Пошел учить про PSCustomObject...

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

Код:
function get-data {
    $reg = gp "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion" |
    select @{
        n = "ProductName";e = {"$($_.ProductName) $($_.ReleaseId) $Channel"}
    }, @{
        n = "Build"
        e = {"$($_.CurrentMajorVersionNumber).$(
            $_.CurrentMinorVersionNumber
        ).$($_.CurrentBuild).$($_.UBR)"}
    }
    $cim = gcim CIM_OperatingSystem|select @{
        n = "Install Date";e ={$_.InstallDate}
    }, @{n = "Architecture";e = {$_.OSArchitecture}}
    [pscustomobject]@{
        'ProductName' = $reg.ProductName
        'Build' = $reg.Build
        'Install Date' = $cim.'Install Date'
        'Architecture' = $cim.Architecture
    }
}
 
get-data|ft

имена переменных почти сохранились




Упс, это попытка
Цитата:
Не вижу, что там тебе опять советует LevT
не советую, спасибо

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 15:29 10-06-2019 | Исправлено: KLASS, 10:44 12-06-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2

Цитата:
главное не смотреть видеокурсы на которые обычно кивает LevT...

 
По русски - только видеокурс, который нашел iNNOKENTIY21, и KLASS прикопал здесь в шапке.
По-английски изданные и доступные на либрусеке книжки есть, но лучшее в самиздате на leanpub.com

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 17:42 10-06-2019 | Исправлено: LevT, 17:43 10-06-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
farag

Цитата:
Пошел учить про PSCustomObject...

или классы
 

Код:
class OSInfo {
    hidden [string]$Path = "HKLM:\SOFTWARE\Microsoft\Windows nt\CurrentVersion"
    [PSCustomObject]$CurrentVersion
    [Version]$Version
    [datetime]$InstallTime
    [int]$Architecture
 
    OSInfo() {
        $this.CurrentVersion = Get-ItemProperty -Path $this.Path
 
        $this.Version = [Version]::new(
            $this.CurrentVersion.CurrentMajorVersionNumber,
            $this.CurrentVersion.CurrentMinorVersionNumber,
            $this.CurrentVersion.CurrentBuild,
            $this.CurrentVersion.UBR)
 
        $this.InstallTime = (
            (get-date -year 1970 -month 1 -day 1 -hour 0 -minute 0 -second 0).
            AddSeconds($this.CurrentVersion.InstallDate).ToLocalTime()
        )
 
        $this.Architecture = [IntPtr]::Size * 8
    }
 
    [string] ToString() {
        return "{0} {1} x{2} {3}`nДата установки: {4}" -f
        $this.CurrentVersion.ProductName,
        $this.CurrentVersion.ReleaseId,
        $this.Architecture,
        $this.Version,
        $this.InstallTime
    }
}
 
#Пользуемся классом
$OSInfo = [OSInfo]::new()
$OSInfo.CurrentVersion
#$OSInfo.Version
#$OSInfo.InstallTime
$OSInfo.ToString()

Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 18:49 10-06-2019
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
 
Write-Output "Installed updates supplied by CBS"
$HotFixID = @{
    Name = "KB ID"
    Expression = {$_.HotFixID}
}
$InstalledOn = @{
    Name = "Installed on"
    Expression = {$_.InstalledOn.Tostring().Split("")[0]}
}
$c = Get-HotFix | Select-Object -Property $HotFixID, $InstalledOn
 
$Session = New-Object -ComObject "Microsoft.Update.Session"
$Searcher = $Session.CreateUpdateSearcher()
$historyCount = $Searcher.GetTotalHistoryCount()
$KB = @{
    Name = "KB ID"
    Expression = {[regex]::Match($_.Title,"(KB[0-9]{6,7})").Value}
}
$Date = @{
    Name = "Installed on"
    Expression = {$_.Date.Tostring().Split("")[0]}
}
$d = $Searcher.QueryHistory(0, $historyCount) | Where-Object -FilterScript {$_.Title -notlike "*Defender*" -and $_.Title -notlike "*WebMedia*"} | Select-Object $KB, $Date
 

 
Не понял, как объединить опять в одну таблицу:
([PSCustomObject] @{
    "KB ID" = $c."KB ID"
    "Installed on" = $d."Installed on"
} | Out-String).Trim()
не прокатывает...

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 11:39 11-06-2019 | Исправлено: farag, 11:41 11-06-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
farag

Цитата:
Не понял, как объединить опять в одну таблицу

Если честно, не могу понять, какой результат Вы хотите получить? Зачем у Вас всё время используется Out-String?


----------
Разум когда-нибудь победит

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 12:03 11-06-2019
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
Результатом будет список всех установленных обновлений, так как через get-hotfix выводится не все.

Цитата:
 используется Out-String

Чтобы пустую строку убрать.

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 12:11 11-06-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
farag
 
Ты пытаешься усидеть на двух стульях
 

Цитата:
Description
    The Out-String cmdlet converts the objects that Windows PowerShell manages into an array of strings. By default, Out-String accumulates the strings and returns them as a single string, but you can use the stream parameter to direct Out-String to return one string at a time. This cmdlet lets you search and manipulate string output as you would in traditional shells when object manipulation is less convenient.
 

- совместить PSCustomObject и привычки из "традиционных шеллов"
 
Хочешь выдать форматированную строку откуда угодно - используй например

Код:
 
"KB ID {0} installed on {1}" -f $Kbid, $Installed
 

Хочешь дальше в скриптах использовать - агрегируй только нужные поля в PSCustomObject или в класс.
 

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 12:18 11-06-2019 | Исправлено: LevT, 12:26 11-06-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
farag
Просто объединить массивы $d+=$c

Цитата:
Результатом будет список всех установленных обновлений, так как через get-hotfix выводится не все.

Но записи могут быть продублированы. Не зная, для чего такой массив, но я бы использовал hash с номером обновления в качестве ключа.

Код:
$d = @{}
 
Write-Output "Installed updates supplied by CBS"
 
Get-HotFix | foreach { $d[$_.HotFixID] = $_.InstalledOn }
 
$Session = New-Object -ComObject "Microsoft.Update.Session"
$Searcher = $Session.CreateUpdateSearcher()
$historyCount = $Searcher.GetTotalHistoryCount()
$Searcher.QueryHistory(0, $historyCount) | where {$_.Title -notlike "*Defender*" -and $_.Title -notlike "*WebMedia*" -and $_.Title -match "\((KB\d+)\)"} | foreach {
    $d[$Matches[1]] = $_.Date
}
 
$d


----------
Разум когда-нибудь победит

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 12:50 11-06-2019 | Исправлено: Smitis, 13:10 11-06-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть класс AsusPDDrivers.psm1 и скрипт Get-AsusPDDrivesLatest.ps1 его использующий

Код:
using module .\AsusPDDrivers.psm1
 
#$MB = "H110M-A/M.2"
#$MB = "TUF H370-PRO GAMING (WI-FI)"
 
# Название материнской платы должно совпадать с названием на странице МП:
# "https://www.asus.com/us/Motherboards/ROG-STRIX-Z390-E-GAMING/HelpDesk_Download"
$MB = "ROG STRIX Z390-E GAMING"
 
$OS = [OS]::Windows_10_64
 
$AsusPDDrivers = [AsusPDDrivers]::new($OS, $MB)
$AsusPDDrivers.GetLatest()

Как бы организовать проверку обновлений? Есть идеи? Сохранять в файл всё ($DriverTools) и затем сравнивать с Latest ?

Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 15:31 11-06-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
Как бы организовать проверку обновлений? Есть идеи?

Идея-то есть, но для неё надо получить прямые ссылки и пути к локальным файлам. И всё.
Составляем список пар Source:Destination и прикручиваем к скрипту (первый элемент пары вполне возможно сделать динамическим):
Берем из шапки скрипт, в котором есть и проверка "свежести" удаленного файла и собственно, скачивание (которое при желании можно оформить в фоновую задачу).

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 18:02 11-06-2019 | Исправлено: YuS_2, 18:05 11-06-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2

Цитата:
Идея-то есть, но для неё надо получить прямые ссылки и пути к локальным файлам. И всё.

Локальные файлы не все в наличии.
Например для моего рабочего компа, видео драйвер на сайте 2017 года и хранить его смысла нет. А сведения, если появится новый драйвер, желательны
 
Так вроде работает Get-AsusPDDriversUpdates.ps1

Код:
using module .\AsusPDDrivers.psm1
 
# Название материнской платы должно совпадать с названием на странице МП:
# https://www.asus.com/us/Motherboards/ROG-STRIX-Z390-E-GAMING/HelpDesk_Download
$MB = "ROG STRIX Z390-E GAMING"
$OS = [OS]::Windows_10_64
$FullName = Join-Path -Path $PSScriptRoot -ChildPath "AsusPDDrivers.xml"
 
$AsusPDDrivers = [AsusPDDrivers]::new($OS, $MB)
$Current = $AsusPDDrivers.DriverTools.Files
 
if (Test-Path -LiteralPath $FullName) {
    [PSCustomObject] $Previous = Import-Clixml -LiteralPath $FullName
    $Current | Where-Object {$Previous.id -notcontains $_.Id}
} else {
    $AsusPDDrivers.GetLatest()
}
 
$Current | Export-Clixml -LiteralPath $FullName -Encoding Unicode -Force

 
Требуется файл AsusPDDrivers.psm1, размещённый в папке со скриптом, из предыдущего моего поста.
Скрипт сохраняет файл AsusPDDrivers.xml в папку, откуда был запущен.


Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 19:36 11-06-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
А сведения, если появится новый драйвер, желательны

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

Код:
$remotetime = get-date((iwr $_.source -method 'head' -verbose:$false).headers.'last-modified')

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 21:27 11-06-2019 | Исправлено: YuS_2, 21:30 11-06-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Идея! Но так ссылки на файлы получить, надо загрузить данные, а потом еще и заголовки у каждого файла для извлечения даты. Вроде как в данном случае замороченнее.  Но в копилочку сниппетов добавлю
 
Заметил в Получаемых объектах что у не актуальных, еще и - в начале в Title и Description.
Но полагаться поди не стоит на это, Id надёжнее.

Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 22:27 11-06-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хочется event-off. Доабвить событие в класс с параметром, в котором передавать объект.
В скрипте подписаться на событие и получить объект. Возможно/как/примеры есть ?

Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 13:56 12-06-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обновил немного AsusPDDrivers.psm1 добавлен метод: [PSCustomObject] NotContains([PSCustomObject] $PreviousFiles).
В вызывающем коде, теперь можно делать [PSCustomObject] $New = $AsusPDDrivers.NotContains($Previous), как то так

Код:
using module .\AsusPDDrivers.psm1
 
# Название материнской платы должно совпадать с названием на странице МП:
# "https://www.asus.com/us/Motherboards/ROG-STRIX-Z390-E-GAMING/HelpDesk_Download"
$MB = "ROG STRIX Z390-E GAMING"
$OS = [OS]::Windows_10_64
$FullName = Join-Path -Path $PSScriptRoot -ChildPath "AsusPDDrivers.xml"
 
$AsusPDDrivers = [AsusPDDrivers]::new($OS, $MB)
 
if (Test-Path -LiteralPath $FullName) {
    [PSCustomObject] $Previous = Import-Clixml -LiteralPath $FullName
    [PSCustomObject] $New = $AsusPDDrivers.NotContains($Previous)
 
    if ($New) {
        foreach ($item in $New) {
            [uri] $Uri = [uri]::new($item.DownloadUrl.Global)
            [string] $Name = $Uri.Segments[$Uri.Segments.Count - 1]
            $item
            $Name
            # bla-bla-bla
            #Invoke-WebRequest -Uri $Uri -OutFile $Name
        }
    } else {
        Write-Host "No Updates"
    }
}
 
$AsusPDDrivers.DriverTools.Files |
    Export-Clixml -LiteralPath $FullName -Encoding Unicode -Force

 
Как использовать в консоли PowerShell, последовательно:
 
#Использовать модуль

Код:
using module "К:\Файлу\Путь\AsusPDDrivers\AsusPDDrivers.psm1"

#Создать объект и получить данные со страницы драйверов и утилит, для последующего доступа к данным

Код:
$AsusPDDrivers = [AsusPDDrivers]::new([OS]::Windows_10_64, "ROG STRIX Z390-E GAMING")

#Получить имена секций

Код:
$AsusPDDrivers.GetSectionNames()

#Получить данные о последнем файле в секции BIOS

Код:
$AsusPDDrivers.GetLastInSection("BIOS")

#Получить данные о последних файлах из всех секций

Код:
$AsusPDDrivers.GetLatest() | Format-Table Title, FileSize, ReleaseDate


Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 20:25 12-06-2019 | Исправлено: iNNOKENTIY21, 21:48 12-06-2019
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Активные темы » Сценарии для Windows


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru