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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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.
• Сторонние консольные утилиты можно использовать только в виде готового решения и только в рамках сценариев. Никаких обсуждений и обучений работе с утилитами не предусмотрено и прямо запрещено правилами топика.
Шапка и около-темные вопросы |

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



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

Код:
[byte[]] $Value = 00, 00, 00, 00
$Path = 'HKCU:\Software\1'
New-ItemProperty -Path $Path -Name link -PropertyType Binary -Value $value -Force
#проверку можно так
($Value -join ' ') -eq ((Get-ItemPropertyValue -Path $Path -Name link -ErrorAction SilentlyContinue) -join ' ')
 

Всего записей: 1390 | Зарегистр. 12-12-2006 | Отправлено: 18:20 19-05-2020
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Для функции надо, чтобы $options был вида

Код:
 
$Options = 'test1', 'text2', 'menu3', 'result4'
 

Как разбить можно буквы дисков?

Код:
 
(Get-Disk | Where-Object -FilterScript {$_.BusType -ne "USB"} | Get-Partition | Get-Volume | Where-Object -FilterScript {$null -ne $_.DriveLetter}).DriveLetter | Sort-Object
 


Код:
 
-join ", "
 

не помогает: функция воспринимает как одну строку, без разбиений.

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 00:06 20-05-2020
westlife



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
farag
Я убрал лишний Menu -Title $Title -Options $Options и вот эта папка "Pictures" перенеслась, остальные переносы я убрал и не проверял.

Код:
if ($RU)
{
    $Title = "Выберите букву диска"
}
else
{
    $Title = "Pictures"
}
############# Menu -Title $Title -Options $Options
$Selected = $Options[(Menu -Title $Title -Options $Options)]
$Selected = "${selected}:"
UserShellFolder -UserFolder Pictures -Path $selected

Всего записей: 1390 | Зарегистр. 12-12-2006 | Отправлено: 00:35 20-05-2020
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
westlife
Да, перенос работает, но уже не суть. Я забыл указать, что функция другая (https://qna.habr.com/q/706569). Предыдущая не понравилась, что очищает консоль.

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 01:18 20-05-2020
YuS 2



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

Цитата:
Как разбить можно буквы дисков?


Цитата:
не помогает: функция воспринимает как одну строку, без разбиений.

Коллега, Вам бы выспаться надо, по ночам лучше не работать...  
Объединять в строку массив объектов, чтобы потом его разбивать - бессмысленно.

Код:
(Get-Disk | ? BusType -ne "USB" | Get-Partition | Get-Volume | ? DriveLetter -ne $null).DriveLetter.gettype()

Достаточно приведения типа, если требуется массив строк:

Код:
([string[]](Get-Disk | ? BusType -ne "USB" | Get-Partition | Get-Volume | ? DriveLetter -ne $null).DriveLetter).gettype()

 
Добавлено:
И ещё:

Код:
(Get-Disk | ? BusType -ne "USB" | Get-Partition | Get-Volume | ? DriveLetter -ne $null).DriveLetter

- зачем такие сложности?
Разве этого:

Код:
(Get-Volume | ?{$_.DriveLetter -ne $null -and $_.DriveType -eq 'Fixed'}).driveletter

- не достаточно?

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 04:54 20-05-2020 | Исправлено: YuS 2, 05:31 20-05-2020
Adalon



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

Цитата:
Свежие версии PowershellGet и PSReadline легко получить в Powershell v7  

 
Да, но только 7-я версия не заменяет 5-ю, а дополняет.
А мне не очень нравится подобное соседство.
 

Цитата:
Немножко сложнее, но тоже "одной строчкой" можно обновить "прибитые гвоздями" к v5.1 старые модули из комплекта винды.
Это надо делать именно штатными средствами v5.1, а не отсебятными
Грамотные инструкции есть, я по ним делал  

 
А есть ссылки?
 

Цитата:
Автоматически используется свежая версия

 
Вот, это нужная информация. Спасибо.
 

Цитата:
"Прибиты гвоздями", и будут восстанавливаться с обновлениями винды  

 
Офигеть...
 

Цитата:
Достаточно RemoteSigned  

 
Да, опытным путём я уже тоже до этого дошел.
 

Цитата:
У кого нет этого груза совместимости, причин ограничивать себя 5.1 нет.

 
Повторю, если бы 7-я заменяла бы старую, то я бы не задумываясь поставил бы сразу и забыл.

Всего записей: 156 | Зарегистр. 14-02-2006 | Отправлено: 07:03 20-05-2020
farag



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

Код:
 
[string[]](Get-Disk | ? BusType -ne "USB" | Get-Partition | Get-Volume | ? DriveLetter -ne $null).DriveLetter
 

Не фурычит : создается меню с буквами, но перемещаться нельзя. https://pastebin.com/W1WCVRsk

Цитата:
не достаточно

Конечно, нет: внешние жесткие диски пропустит иначе.

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 10:57 20-05-2020 | Исправлено: farag, 11:24 20-05-2020
westlife



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
farag
У себя в скрипте ограничил выбор только на локальные диски (fixed).
Вот так работает всё, сделал в таком выводе, чтобы удобней и наглядней было при вставке в консоль PS.

Код:
function ShowMenu([array]$Menu, [int]$Default)
{
  $minY = [Console]::CursorTop
  $y = [Math]::Max([Math]::Min($Default, $Menu.Count), 0)
  do {
    [Console]::CursorTop = $minY
    [Console]::CursorLeft = 0
    $i = 0
    foreach ($item in $Menu) {
      $colors = @{
         BackgroundColor = if ($i -ne $y) { [Console]::BackgroundColor } else { 'Cyan' }
         ForegroundColor = if ($i -ne $y) { [Console]::ForegroundColor } else {' Blue' }
      }
      Write-Host (' {0}. {1} ' -f ($i+1), $item) @colors
      $i++
    }
    $k = [Console]::ReadKey()
    switch ($k.Key) {
      'UpArrow' { if ($y -gt 0) { $y-- } }
      'DownArrow' { if ($y -lt ($menu.Count - 1)) { $y++ } }
      'Enter' { return $Menu[$y] }
    }
  } while ($k.Key -notin ([ConsoleKey]::Escape, [ConsoleKey]::Enter))
}
 
$Menu = (Get-Disk | Where-Object -FilterScript {$_.BusType -ne "USB"} | Get-Partition | Get-Volume | Where-Object -FilterScript {$null -ne $_.DriveLetter}).DriveLetter | Sort-Object
 
Write-Host " Выбраный диск: $($Select = ShowMenu $menu 0 ; "$Select`:\")" -ForegroundColor Yellow
 

Всего записей: 1390 | Зарегистр. 12-12-2006 | Отправлено: 11:34 20-05-2020
YuS 2



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

Цитата:
создается меню с буквами, но перемещаться нельзя.

Ссылками лучше не публиковать код, здесь топик, как раз, про такой код, так что лучше прямо здесь... мне, например, чтобы попасть на тот сайт, приходится tor запускать...
В общем, массив тут не при чем. Там двойное ожидание ввода... перемещение будет по двойному нажатию.
Как-то так:

Код:
function ShowMenu {
    param
    (
        [Parameter(Mandatory = $true)]
        [string]$Title,
        [Parameter(Mandatory = $true)]
        [array]$Options,
        [Parameter(Mandatory = $true)]
        [int]$Default
    )
    Write-Host $Title
    [console]::CursorVisible=$false
    $minY = [Console]::CursorTop
    $y = [Math]::Max([Math]::Min($Default, $Options.Count), 0)
    do {
        [Console]::CursorTop = $minY
        [Console]::CursorLeft = 0
        $i = 0
        foreach ($item in $Options) {
            $colors = @{
                BackgroundColor = if ($i -ne $y) {
                    [Console]::BackgroundColor
                } else { "Cyan" }
                ForegroundColor = if ($i -ne $y) {
                    [Console]::ForegroundColor
                } else { "Blue" }
            }
            Write-Host (' {0}. {1} ' -f ($i+1), $item) @colors
            $i++
        }
        switch ($a = [Console]::ReadKey().Key) {
            "UpArrow" {
                if ($y -gt 0) {    $y-- }
            }
            "DownArrow" {
                if ($y -lt ($Options.Count - 1)) { $y++ }
            }
            "Enter" {
                [console]::CursorVisible=$true
                return $Options[$y]
            }
        }
    } while ($a -notin ([ConsoleKey]::Escape, [ConsoleKey]::Enter))
}
if ($RU) { $Title = "Выберите букву диска" } else { $Title = "Desktop" }
#$Options = 'test1', 'text2', 'menu3', 'result4'
$Options = [string[]](Get-Disk | Where-Object -FilterScript {$_.BusType -ne "USB"} |
Get-Partition | Get-Volume |
Where-Object -FilterScript {$null -ne $_.DriveLetter}).DriveLetter | Sort-Object
 
ShowMenu -Title $Title -Options $Options -Default 2
[console]::CursorVisible=$true

 

Цитата:
Конечно, нет: внешние жесткие диски пропустит иначе.

Почему?
 
Например:

- здесь H - внешний жесткий диск, на док-станции... и Ваш вариант, его, как раз, "не видит"...
 
Добавлено:
Adalon

Цитата:
но только 7-я версия не заменяет 5-ю, а дополняет.

Powershell Core 7.0 - самостоятельная версия, она ничего не дополняет.
PS Core 7.0 умеет подгружать модули из версии 5.1, если какого-то функционала не хватает...
 

Цитата:
если бы 7-я заменяла бы старую, то я бы не задумываясь поставил бы сразу и забыл.

А если она работает самостоятельно, то ни за что на свете не установите?  
Понятно.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 17:19 20-05-2020 | Исправлено: YuS 2, 21:52 21-05-2020
farag



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

Цитата:
риходится tor запускать

Но ведь это обычный Habr, не заблокированный РКН.
 

Цитата:
перемещение будет по двойному нажатию

Все было еще проще на самом деле: я указывал несуществующий DefaultChoice 2 при наличии на ультрабуке всего одно диска.
 

Цитата:
- здесь H - внешний жесткий диск, на док-станции... и Ваш вариант, его, как раз, "не видит"...  

Там мне как раз и не надо, чтобы внешние жесткие диски были видны.
 
В общем доделал. Все спасибо. Такое вышло
Подробнее...

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 00:25 21-05-2020 | Исправлено: farag, 18:53 21-05-2020
Adalon



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть часть скрипта

Код:
 
Get-AppxPackage -AllUsers | ForEach-Object {
    if ($Apps -contains $_.Name) {
           Write-Host Удаляем $_.Name...
           Get-AppxPackage -AllUsers $_.Name | Remove-AppxPackage
           # Ждем завершения 1
        }
}
# Ждем завершения 2
 

 
По факту Get-AppxPackage -AllUsers очень быстро получает список приложений и одновременно посылается куча команд Get-AppxPackage -AllUsers $_.Name | Remove-AppxPackage.
Как будто мы просто разом скопировали вот это и нажали Enter:
Get-AppxPackage -AllUsers Microsoft.BingWeather | Remove-AppxPackage
Get-AppxPackage -AllUsers Microsoft.GetHelp | Remove-AppxPackage
Get-AppxPackage -AllUsers Microsoft.Getstarted | Remove-AppxPackage
Get-AppxPackage -AllUsers Microsoft.Microsoft3DViewer | Remove-AppxPackage
Get-AppxPackage -AllUsers Microsoft.MicrosoftOfficeHub | Remove-AppxPackage
Get-AppxPackage -AllUsers Microsoft.MicrosoftSolitaireCollection | Remove-AppxPackage
...
И в том, и в другом случае всё это будет удаляться одновременно.
 
Задача или ожидать выполнения каждой команды в отдельности, чтобы выполнение "Ждем завершения 1" было после окончания выполнения команды, или же скрипт ждал выполнения всех этих команд в месте "Ждем завершения 2".
 
Можно ли это сделать?

Всего записей: 156 | Зарегистр. 14-02-2006 | Отправлено: 11:28 21-05-2020
YuS 2



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

Цитата:
Но ведь это обычный Habr, не заблокированный РКН.

РКН нам не указ
Но это и не про хабр я говорил, речь про pastebin.com...
Он может и не заблокирован, просто у провайдера руки-крюки, ибо на работе этот сайт открывается, но и провайдер другой...
 

Цитата:
Все было еще проще на самом деле: я указывал несуществующий DefaultChoice 2 при наличии на ультрабуке всего одно диска.

Бывает... говорю же, по ночам надо спать больше, это от недосыпа...
 

Цитата:
Там мне как раз и не надо, чтобы внешние жесткие диски были видны.

А, вононочо... тогда да, USB отрубаем и вперед...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 11:37 21-05-2020
westlife



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

Цитата:
Можно ли это сделать?

Я, например, вообще не понял что вам надо, что такое "ЭТО сделать". Что вы там ждете.
Вы лучше напишите что хотите чтобы было в какой то момент, а не ждем тут, ждем там.  
Зачем ждать, какая цель?
Сделайте пример что у вас не выходит, но хотели бы чтобы вышло. Тогда всем будет понятно.

Всего записей: 1390 | Зарегистр. 12-12-2006 | Отправлено: 11:20 22-05-2020
newhk



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Приветствую!
Снова у меня вопрос.
 
Хочу сделать бесконечный цикл с проверкой условия, если условие неверно, то начинать цикл сначала, без продолжения, если иначе, то выполнять блок кода.
Вот что придумало мое воображение... ))
 

Код:
 
$hour = (get-date).Hour
while ($true){
    if (([int32]$hour -gt 9 -and [int32]$hour -lt 19) -eq 'False'){
        continue
        }
    else {
        'здесь  
        блок  
        кода'
    }
}
 

 
По факту получается, что условие не выполняется, т.е. "continue" отрабатывает всегда, не зависимо от того что является проверкой ('True' или 'False')
Не понимаю почему.
Если выполнить просто

Код:
 
[int32]$hour -gt 9 -and [int32]$hour -lt 19
 

Возвращается True.
Почему оно не воспринимается в условии? Подскажите пожалуйста.

Всего записей: 400 | Зарегистр. 02-02-2009 | Отправлено: 14:48 22-05-2020 | Исправлено: newhk, 15:10 22-05-2020
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
newhk
Вот из-за этого чуда:

Цитата:
-eq 'False'

Напишите условие по-человечески и всё заработает.
if ($hour -gt 9 -and $hour -lt 19){
и обратное
if (-not($hour -gt 9 -and $hour -lt 19)){ или так if ($hour -le 9 -or $hour -gt 19){


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

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 15:28 22-05-2020 | Исправлено: Smitis, 15:32 22-05-2020
YuS 2



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

Цитата:
Хочу сделать бесконечный цикл с проверкой условия

Он у Вас уже есть...
 

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

Разберитесь с логикой того, что хочется получить, ничего непонятно.
А условный блок работает так:

Код:
if($true){'Yes'}else{'No'}

или так:

Код:
if(!$false){'Yes'}else{'No'}

- в обоих случаях условие выполнено, т.е. True и соответственно, результатом будет Yes
Если же условие не выполняется, т.е. False, то результатом будет No

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 15:42 22-05-2020
newhk



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Строго говоря, у меня наоборот.
Если условие НЕ выполняется, то начать сначала, а если выполняется, то выполнить блок кода.
 
Если я правильно всех понял, то должно быть так?
 

Код:
 
$hour = (get-date).Hour
while ($true){
    if (!([int32]$hour -gt 9 -and [int32]$hour -lt 19)){
        continue
        }
    else {
        'здесь  
        блок  
        кода'
    }
}
 

Всего записей: 400 | Зарегистр. 02-02-2009 | Отправлено: 10:48 23-05-2020 | Исправлено: newhk, 10:49 23-05-2020
YuS 2



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

Цитата:
то должно быть так?

Да, примерно так...

Код:
True -and True = True
False -and True = False
True -and False = False

соответственно:

Код:
!(True -and False) = True
!(False -and True) = True

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 11:28 23-05-2020
farag



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

Код:
 
New-Object -TypeName System.Windows.Forms.FolderBrowserDialog
 

Выдается окно для выбора директории a la XP. Как можно сделать окно на PowerShell вида как начиная с Vista? Чтобы вот так было: https://i.stack.imgur.com/T6xkD.jpg
Ссылка по теме: http://csharphelper.com/blog/2018/11/use-a-standard-windows-dialog-to-let-the-user-select-folders-in-c/
https://github.com/augustoproiete/ookii-dialogs-wpf#vista-style-common-file-dialogs
 

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 23:00 23-05-2020 | Исправлено: farag, 23:14 23-05-2020
Smitis



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

Цитата:
Если я правильно всех понял, то должно быть так?  

[int32] можно не ставить. Лишнее.

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

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 23:12 23-05-2020
Открыть новую тему     Написать ответ в эту тему

Страницы: 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