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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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 226 227 228 229 230

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

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

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

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
farag, мне хотя бы простое понять, а дальше сделаю сам. Присвоить переменной значение. Есть несколько вариантов вызова powershell. Начнем с такого (прописывается в реестре):

Код:
cmda.exe /q /c & echo $ddd = "12345" | powershell.exe -NoProfile -NoExit -ExecutionPolicy Bypass

Переменной ничего не присваивается. Что еще дописать не знаю после параметров, чтобы powershell отработал.

Всего записей: 3548 | Зарегистр. 24-10-2002 | Отправлено: 01:20 11-01-2020 | Исправлено: Death_INN, 01:25 11-01-2020
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Death_INN
 
powershell -Command {$var = 'VALUE'; $var}
 
Всё написано в справке powershell -h
 
Добавлено:
 
Но если я недопонял задачу, и надо что-то присвоить переменной не пошика, а какого-то другого exe - это вопрос скорее к знатокам последнего.

Всего записей: 17727 | Зарегистр. 14-10-2001 | Отправлено: 01:30 11-01-2020
dialmak



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что мешает передать переменную пошику как аргумент?
Что мешает в пошике прочитать переменную среды?
Кстати первый вариант предпочтительнее. ибо, если пошик начнет получать и получит админправа, а cmd их не имел, то второй вариант не сработает..

Всего записей: 14007 | Зарегистр. 27-04-2013 | Отправлено: 02:17 11-01-2020
Death_INN

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT, моя задача устанавливать приложения Appx(Bundle) через powershell. Переменные мне будет проще создавать в cmd, а powershell их примет через $env:...
dialmak, у меня cmda.exe всегда и отовсюду от админа запускается, поэтому пошик права получит
 
Добавлено:

Цитата:
Что мешает передать переменную пошику как аргумент?

Он и так будет принимать в качестве аргумента %1 - т.е. полный путь, но я всех тонкостей не знаю, ибо нужно будет далее в коде юзать только имя файла. Мне проще подготовку сделать в cmd и затем передать переменные пошику

Всего записей: 3548 | Зарегистр. 24-10-2002 | Отправлено: 02:24 11-01-2020 | Исправлено: Death_INN, 02:38 11-01-2020
iNNOKENTIY21



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

Цитата:
А рандом может и прикольнее, но это всегда хуже детерминизма.
Коли уж приспичило рандом, правильно добывать его из детерминированного окружением $FreeChars

Потому и прикольнее, особенно когда один элемент только и свободен, и элементов не 24 а пару тысяч, а мы его таким рандомом
Кто то, код, таки читает

Цитата:
К тому же твой пример поощряет неправильный (процедурный) подход.

Это я не понял, что «неправильный» и, что «процедурный».

Всего записей: 3640 | Зарегистр. 16-08-2012 | Отправлено: 08:53 11-01-2020
LevT



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

Цитата:
Это я не понял, что «неправильный» и, что «процедурный».  

 
Явные вручную заданные циклы, брейки и континуе
То есть твой код работает с изменяемым состоянием (mutable state)
 
Сейчас это читается как использование goto
Правильно писать чистые функции без изменяемого состояния, и из них компоновать программу.
 
 
Добавлено:
 
1) Пишем функцию-определение $UsedChars,
2) через её вызов-применение к операционному окружению в конкретный момент определяем другую функцию $FreeChars
(после того как ты воткнешь или вытащишь флешку, результат будет другим - но функция всё равно чистая)
 
Это повторно используемые части, выделенные из обоих твоих примеров.
В качестве бонуса: чистые функции без мутабельного состояния.

Всего записей: 17727 | Зарегистр. 14-10-2001 | Отправлено: 09:17 11-01-2020 | Исправлено: LevT, 09:24 11-01-2020
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Цитата:
Явные вручную заданные циклы, брейки и континуе  

Без continue можно обойтись:
Код:
function Get-FreeDiskLetter {
   $Used = [IO.DriveInfo]::GetDrives().Name.Foreach{ $PSItem.Remove(1) }

   if (@($Used).Count -ge 24) {
       "Все буквы заняты"
       break
   }

   foreach ($Num in (66..90)) {
       [char] $Char = $Num

       if ($Char -notin $Used) {
           $Char
           break
       }
   }
}

А как без цикла и прерывания цикла?

Цитата:
То есть твой код работает с изменяемым состоянием (mutable state)
 
Сейчас это читается как использование goto
Правильно писать чистые функции без изменяемого состояния, и из них компоновать программу.  

Покажи рабочий код  
 
Добавлено:


Еще код и затык с тем же Get-Volume в $CDRomLetter = (Mount-DiskImage $ISO | Get-Volume).DriveLetter
 

Код:
## Сценарий, должен запускаться с повышенными правами пользователя
#Requires -RunAsAdministrator

## Указывает минимальную версию PowerShell, требуемую сценарию.
#Requires -Version 5

function PromptIndex {
   param (
       [int] $Minimum,
       [int] $Maximum
   )

   do {
       [int] $Index = Read-Host -Prompt "Введите цифру индекса"
   } while (($Index -lt $Minimum) -or ($Index -gt $Maximum))

   $Index
}

# Полный путь к образу диска дистрибутива Windows
$ISO = "U:\Distributives\OS\Windows\ru_windows_10_business_editions_version_1909_updated_dec_2019_x64_dvd_2d4f8f30.iso"

# Проверка существования $ISO
if (-not (Test-Path -Path $ISO)) { throw "Не найден: '$ISO'" }

# Монтирование iso и получение буквы диска CDRom
$CDRomLetter = (Mount-DiskImage $ISO | Get-Volume).DriveLetter

# Путь к install.wim
$Wim = $CDRomLetter + ':\sources\install.wim'

# Получение редакций Windows в образе
$Editions = Get-WindowsImage -ImagePath $Wim
$Editions | Format-Table ImageIndex, ImageName, ImageSize

# Выбор редакции Windows
$Index = PromptIndex -Minimum 1 -Maximum $Editions.Count
$Editions[$Index - 1] | Format-Table ImageIndex, ImageName, @{
   N = 'ImageSize (GB)';
   E = {[Math]::Round($_.ImageSize/1GB, 2)}
}

### Что то делаем ###

# Отсоединение виртуального CDRom
Dismount-DiskImage $ISO

Как бы получить букву примонтированного CD.iso пошустрее? Ну и так покритиковать, предложить чего, есть у кого?

Всего записей: 3640 | Зарегистр. 16-08-2012 | Отправлено: 09:40 11-01-2020
LevT



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

Цитата:
Покажи рабочий код

 

Код:

$UsedChars = Get-Volume | select -ExpandProperty DriveLetter
$FreeChars = 66..90 |  foreach {[char]$_} |  where {$_ -notin $UsedChars}
 

 
Получить первую букву  
$FreeChars | sort | select -First 1
 
Рандомную лень писать за ненадобностью
 
 
С профилем поторопился

Всего записей: 17727 | Зарегистр. 14-10-2001 | Отправлено: 10:35 11-01-2020 | Исправлено: LevT, 10:40 11-01-2020
iNNOKENTIY21



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

Цитата:
$UsedChars = Get-Volume | select -ExpandProperty DriveLetter
$FreeChars = 66..90 |  foreach {[char]$_} |  where {$_ -notin $UsedChars}  

Нет цикла? Всё перебирает же, всё сортирует, и только потом возвращает. Не вижу профита, чего то?
 
Добавлено:

Цитата:
Рандомную лень писать за ненадобностью  


Код:
$FreeChars | Get-Random


Всего записей: 3640 | Зарегистр. 16-08-2012 | Отправлено: 10:47 11-01-2020
LevT



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

Код:

$UsedChars = & {Get-Volume | select -ExpandProperty DriveLetter}
$FreeChars = & {66..90 | foreach {[char]$_} | where {$_ -notin $UsedChars}}

 
А я опять соврал
В профиле надо определить переменные так

 
$UsedChars = {Get-Volume | select -ExpandProperty DriveLetter}
$FreeChars = {66..90 | foreach {[char]$_} | where {$_ -notin (& $UsedChars)}}

А в коде сценария вызывать через & так

 
& $UsedChars
 
& $FreeChars | select -First 1
& $FreeChars | Get-Random

 
Это использование того факта, что скриптблоки это замыкания (то есть - функции, анонимные но с блекджеком и акробатами).
 
Вызываются они в момент конструирования переменной на текущем (в тот момент) операционном окружении.
Если в профиль прописать без них, то переменные вычислятся один раз при старте пс, и станут неактуальными после втыкания флешки например.
 
 
Добавлено:

Цитата:
Нет цикла

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

Цитата:
 Всё перебирает же, всё сортирует, и только потом возвращает.

 
Goto тоже в любом цикле есть
Только если их прописывать вручную вместо использования циклов - получается вырвиглаз

Всего записей: 17727 | Зарегистр. 14-10-2001 | Отправлено: 10:54 11-01-2020 | Исправлено: LevT, 14:26 13-01-2020
iNNOKENTIY21



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

Цитата:
Goto

Это moveNext так обозвал?

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

Вкусовщина. А если не 24 элемента а 24 миллиона и занят только 1? И что будет в $FreeChars, если все буквы заняты?

Всего записей: 3640 | Зарегистр. 16-08-2012 | Отправлено: 11:14 11-01-2020
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21
 
Вначале было программирование процедурное. Метки и goto :label
Потом изобрели структурное (в котором goto моветон, вместо него циклы и ветвления). Ты видимо не застал
 
Сейчас столь же мощная движуха: изобрели функциональное программирование. (точнее, изобрели его раньше всех, но юзали только академические гики)
 
Повершел опередил здесь большинство мейнстримных языков.
 
 
Добавлено:

Цитата:
И что будет в $FreeChars, если все буквы заняты?

 
Проверяем:
 

Код:

$Chars = [char[]]'ABC'
$FreeChars = $Chars | foreach {$_} | where {$_ -notin $Chars}

 
результат пустой
 
Повершел гениален, в нём не только монада List (трубы/стримы), чтобы не писать циклы
 но и монада Optional, чтобы композиции функций не мешались вылезающие null
 
 
Добавлено:

Цитата:
 если не 24 элемента а 24 миллиона  

 
Для миллионов элементов повершел подходит плохо.
В смысле, будет откровенно тормозить.
 
Тут уже надо использовать современные мейнстримные движки, туда кстати тоже завезли функциональные фичи, включая монады.
 
 

Всего записей: 17727 | Зарегистр. 14-10-2001 | Отправлено: 11:24 11-01-2020 | Исправлено: LevT, 11:57 11-01-2020
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Что бы проверять A, надо с 65 элемента проверять. Это у меня требование не занимать A.
Не убедил. Мне, моя запись в функцию, больше подходит. Не модно, не молодёжно, зато быстро и что надо.
Релиз кандидат
Код:
function Get-FreeDiskLetter {
   $Used = [IO.DriveInfo]::GetDrives().Name.Foreach{ $PSItem.Remove(1) }

   if (@($Used).Count -ge 24) { throw "Все буквы дисков заняты!" }

   foreach ($Num in (66..90)) {
       [char] $Char = $Num

       if ($Char -notin $Used) {
           $Char
           break
       }
   }
}

 

Цитата:
Вначале было программирование процедурное. Метки и goto :label
Потом изобрели структурное (в котором goto моветон, вместо него циклы и ветвления). Ты видимо не застал  

Застал, еще на ZX Spectrum gotoзил. Забыл.
Если, что то, стало модным, это не означает, что, что то, что было раньше, стало неправильным. Любишь ярлыки развешивать.
А goto ещё жив, там где ему место, к примеру в батниках…
Теоретизировать не интересно.
Мне бы: $CDRomLetter = (Mount-DiskImage $ISO | Get-Volume).DriveLetter ускорить, уж больно медленный Get-Volume

Всего записей: 3640 | Зарегистр. 16-08-2012 | Отправлено: 12:42 11-01-2020
LevT



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

Цитата:
Что бы проверять A, надо с 65 элемента проверять. Это у меня требование не занимать A.  

 
не понял, поясни
 
 

Цитата:
А goto ещё жив, там где ему место, к примеру в батниках…  

 
некрофилия.
И XP "ещё жива", а где-то "находится место" даже для 95/98/ME
 
 
Добавлено:

Цитата:
Мне, моя запись в функцию, больше подходи

 
Ты прячешь голову в песок к при виде новой для себя функциональности как старпёр
 
А вот в моём арсенале остаются также и именованные функции, и ручные циклы, и даже goto
В порядке убывания... но о goto вот практически забыл уже, за ненадобностью

Всего записей: 17727 | Зарегистр. 14-10-2001 | Отправлено: 12:44 11-01-2020 | Исправлено: LevT, 12:54 11-01-2020
iNNOKENTIY21



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

Цитата:
не понял, поясни  


Код:
function Get-FreeDiskLetter {
   $B = 66
   $Z = 90

   $Used  = [IO.DriveInfo]::GetDrives().Name.Foreach{ $PSItem.Remove(1) }
   $Count = $Z - $B

   if (@($Used).Count -ge $Count) { throw "Все буквы дисков заняты!" }

   foreach ($Num in ($B..$Z)) {
       [char] $Char = $Num

       if ($Char -notin $Used) {
           $Char
           break
       }
   }
}

 
О5 ярлыки и бла-бла, если кому то надо xp, зачем же ярлык вешать.

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

Это откуда вылезло?
Если мне не приглянулось, что ты предложил, то всё некрофил , старпёр goto :пенсия
Получше, чего предложи, где видно будет, что да, рулит.
А тут, вот, не рулит.

Всего записей: 3640 | Зарегистр. 16-08-2012 | Отправлено: 13:03 11-01-2020
LevT



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

Цитата:
 
   if (@($Used).Count -ge $Count) { throw "Все буквы дисков заняты!" }  
 

 
очень много внимания уделяешь крайне редкому случаю
 
Расходуешь ресурс.
И свой личный, и читателей твоего кода.
 
Минута твоего времени в миллион раз ценней сэкономленных тактов процессора.
Это как я надеюсь ты уже где-то слышал, а вот новое
дополнение от меня:  
 
неумение кодить в стиле "а подай мне золотую рыбку" и в результате горы говнокода в гугле - то, что отпугнуло множество людей от повершел
 
 
Добавлено:
iNNOKENTIY21
 
Эта тема просто бриллиант на общем фоне, в т. ч. и твоими трудами
Но ещё есть-таки резервы, и очень жаль, что ты от их применения отбрыкиваешься.






Заканчивай поучать

Всего записей: 17727 | Зарегистр. 14-10-2001 | Отправлено: 13:22 11-01-2020 | Исправлено: LevT, 16:35 11-01-2020
iNNOKENTIY21



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

Цитата:
throw "Все буквы дисков заняты!"


Цитата:
очень много внимания уделяешь крайне редкому случаю  

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

Всего записей: 3640 | Зарегистр. 16-08-2012 | Отправлено: 13:31 11-01-2020
LevT



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

Использование исключений вместо ветвлений считается антипаттерном.
Эта уже общепринято в мейнстримном программировании
 
А с монадами и ветвления скрыты..
 

Всего записей: 17727 | Зарегистр. 14-10-2001 | Отправлено: 13:33 11-01-2020 | Исправлено: LevT, 13:42 11-01-2020
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как сие решить их строго без использования конвейера. Только при помощи переменных, массивов и программных конструкций. Связывать команды в конвейер не допускается. Загружайте результат работы в переменную и дальше анализируйте её программно? Какое-то извращенное оно.
Подробнее...

Всего записей: 2522 | Зарегистр. 27-07-2009 | Отправлено: 10:36 13-01-2020
iNNOKENTIY21



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

Цитата:
Как сие решить их строго без использования конвейера. Только при помощи переменных, массивов и программных конструкций. Связывать команды в конвейер не допускается. Загружайте результат работы в переменную и дальше анализируйте её программно?

Подробнее...

Всего записей: 3640 | Зарегистр. 16-08-2012 | Отправлено: 07:08 14-01-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 226 227 228 229 230

Компьютерный форум 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