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

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

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



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

Цитата:
Вы хотите отказаться от нативного кода? Флаг Вам в руки. Напишите свою ОС на чистом дотнете.  

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

Цитата:
А строки как раз повершеловские.  

 
Повершел не обязан поддерживать ни чужие, ни свои строки снаружи себя.
Содержимое [System.Environment]::CommandLine - оно снаружи.
 
Тем более касаемо строк параметров повершел гордится тем, что внутри себя ничего не парсит специально, а полагается на свой сквозной парсер внутри движка.
Которого снаружи тупо нет (а есть строки, которых нету в повершел AST)
 
 

Цитата:
Только куда Вы денетесь, не оказывая поддержку?

 
Чему? Вуду-коду, фаршу из разных языков, в котором изощряются скриптеры, не находящие себе лучшего применения?  
Обрезанным кастрированным сборкам без дотнета?  
"Обрезанным мозгам", воздерживающимся от трефного дотнета и почитающим это своей религиозной доблестью?
 
Нафига это нам?
 
 

Цитата:
 Будете поддерживать как миленькие. Можете начинать подвывать по этому поводу вместо "олдскулов". Можете пожаловаться на "олдскулов" в ООН. Или можете искать другую работу.  

 
Как видите, возможные претензии олдскулов проигнорированы.
Невзирая на их жалобы в ООН  на руборде

Всего записей: 17741 | Зарегистр. 14-10-2001 | Отправлено: 14:52 20-03-2019 | Исправлено: LevT, 15:27 20-03-2019
YuS_2



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

Цитата:
1. У вас поиск пути профиля привязан к имени выдаваемому из (Get-CimInstance Win32_ComputerSystem).UserName  
А если имя переименовано, то в нем будет текущее новое имя, а путь к профилю в том листе будет со старым именем, поэтому профиль не будет найден.

Вы это проверяли?
Я проверял...  
Дело в том, что класс Win32_ComputerSystem отдает в качестве имени пользователя, как раз путь к профилю в виде:
ComputerName\NameUser
причем именно к имени первичного пользователя...
 

Цитата:
2. В новом варианте у вас -in не работает. Но с like или match работает.  

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

Цитата:
3. Дополнительно. Если запускать от другого пользователя, то если нужно настраивать ветку HKСU, то нужно перенаправлять в HKEY_USERS\UserSID, и тут уже обязателен SID пользователя. Но если скрипт сложный, в котором учитывается разные написания пути к реестру, придется для всех вариантов делать подмену на HKEY_USERS\UserSID, а это лишний геморой. Но это нужно будет учитывать, делая такую поддержку запуска.

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

Цитата:
Просто знаю, как это делается по-уму. Берётся "сырая" командная строка и парсится самостоятельно, если стандартный парсер не подходит (а он слишком специфичный), если надо что-то чуть сложнее, чем просто параметры в кавычках или без. На час работы. Но разработчики PS "ниасилили". Зато придумали костыль в виде EncodeCommand.

Согласен, костыль придумали, но хотя бы описали это в документации и на том спасибо. Про кавычки, кстати, тоже... я там цитату приводил...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 15:00 20-03-2019 | Исправлено: YuS_2, 15:13 20-03-2019
westlife



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

Цитата:
Вы это проверяли?  

Да, смотрите
Тут под новым именем Федя Петров, старое Коля Петров,
(Get-CimInstance Win32_ComputerSystem).UserName показывает Федя Петров

Всего записей: 1483 | Зарегистр. 12-12-2006 | Отправлено: 15:14 20-03-2019
Smitis



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

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

Кому он будет нужен такой? Ответ - никому. Потому он и поддерживает командную строку. Потому как это стандартный метод запуска программ, что бы по этому поводу не думали разные домохозяйки, не представляющие, как функционирует операционная система.
И поэтому домохозяйки могут игнорировать и олдскулов и прочих даунгрейдеров и вообще всё человечество в целом. Кому интересно мнение домохозяек? Никому.
 
А вот все остальные, даже индусы будут это всё поддерживать. Даже вундервафлистов заставляют. Хотя делать плохо им запретить к сожалению невозможно, особенно когда они для галочки кое-как выполнили.

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

Всего записей: 3452 | Зарегистр. 09-02-2003 | Отправлено: 15:29 20-03-2019 | Исправлено: Smitis, 15:30 20-03-2019
LevT



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

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

 
Вот только в винде с мохнатых времён есть [System.Environment]::GetCommandLineArgs()  
- и проги вправе на это API полагаться
 
Невзирая на то, что по этому поводу думают религиозные любители парсить строки вручную,  
читать документацию к результатам чужих парсеров и иногда писать свою (видимо, от скуки и отсутствия более ценных занятий).
 
Дотнетовским программистам и повершел-мастерам курсивное по-прежнему нужно, скриптописателей powershell избавляет и от этого.

Всего записей: 17741 | Зарегистр. 14-10-2001 | Отправлено: 15:35 20-03-2019 | Исправлено: LevT, 15:41 20-03-2019
farag



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

Код:
 
# Установить параметры производительности графики для отдельных приложений на "Высокая производительность" ###
IF ((Get-CimInstance -ClassName Win32_VideoController | Where-Object {$_.AdapterDACType -like "*DAC*"}).Caption)
{
    $exe = Read-Host -Prompt "Введите полный путь до исполняемого файла приложения без кавычек. `nЧтобы пропустить, нажмите Enter"
    IF ($exe)
    {
        New-ItemProperty -Path HKCU:\Software\Microsoft\DirectX\UserGpuPreferences -Name $exe -Type String -Value "GpuPreference=2;" -Force
        # D:\Программы\Paint.net 4.1.6\SetupFrontEnd.exe
    }
}
 

Можно ли как-то правильнее пропустить все по нажатию на Enter? И вообще пришерстить код.

Всего записей: 2522 | Зарегистр. 27-07-2009 | Отправлено: 15:37 20-03-2019 | Исправлено: farag, 16:03 20-03-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
farag
 
По-моему, для работы с ручным вводом через PS Host шерстить уже дальше некуда.
Можно получать путь как-то иначе, но это другая тема.

Всего записей: 17741 | Зарегистр. 14-10-2001 | Отправлено: 15:46 20-03-2019
Smitis



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

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

Ну что делать, если домохозяйки не могут использовать имеющуюся с мохнатых времён [System.Environment]::CommandLine в том случае, если GetCommandLineArgs не справляется с парсингом? Домохозяйки советуют всем вокруг включить мозг, но сами воспользоваться своим же советом не могут, так как включать-то и нечего. Поэтому домохозяйки могут использовать только чужое. Доработать чужое они не в состоянии. Представляю, каких "подмастерьев" себе готовят такие домохозяйки

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

Всего записей: 3452 | Зарегистр. 09-02-2003 | Отправлено: 15:47 20-03-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
 
Вы можете обратиться в Microsoft с предложением улучшить дотнет.
Этим занимается другая команда, а у команды повершел иные приоритеты:
 
https://github.com/PowerShell/PowerShell/issues
Где-то там был специальный раздел user voices...

Всего записей: 17741 | Зарегистр. 14-10-2001 | Отправлено: 15:53 20-03-2019 | Исправлено: LevT, 15:59 20-03-2019
farag



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

Всего записей: 2522 | Зарегистр. 27-07-2009 | Отправлено: 15:58 20-03-2019 | Исправлено: farag, 16:03 20-03-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
farag
Можно написать if (-not $exe)    и
  Where AdapterDACType -like "*DAC*" или
 .Where({...})
 
но это дело вкуса
 
Желательно всё-таки держаться одного выбранного стандарта.

Всего записей: 17741 | Зарегистр. 14-10-2001 | Отправлено: 16:03 20-03-2019 | Исправлено: LevT, 16:06 20-03-2019
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
LevT
Первое и последнее... не остановитесь, выключаю.

Всего записей: 11450 | Зарегистр. 12-10-2001 | Отправлено: 16:05 20-03-2019
iNNOKENTIY21



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

Код:
using namespace System.Security.Principal
 
$LoginUserName        = (Get-CimInstance -ClassName Win32_ComputerSystem).UserName | Split-Path -leaf
$LoginUserSID         = (([NTAccount]$LoginUserName).Translate([SecurityIdentifier])).Value
$LoginUserProfileList = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$LoginUserSID"
$LoginUserProfileDir  = (Get-ItemProperty -Path $LoginUserProfileList).ProfileImagePath
 
[PSCustomObject]@{
    LoginUserName        = $LoginUserName
    LoginUserSID         = $LoginUserSID
    LoginUserProfileList = $LoginUserProfileList
    LoginUserProfileDir  = $LoginUserProfileDir
    IsCurrentUser        = $LoginUserName -eq $env:USERNAME
}

Что говорят лучшие практики по поводу using namespace грешно?
 
Добавлено:
Для перебора ProfileDir
Код:
(Get-CimInstance -ClassName Win32_UserProfile | Where-Object LocalPath -NotLike "$env:SystemRoot\*").LocalPath

Всего записей: 3650 | Зарегистр. 16-08-2012 | Отправлено: 17:41 20-03-2019
YuS_2



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

Цитата:
Да, смотрите  
Тут под новым именем Федя Петров, старое Коля Петров,  
(Get-CimInstance Win32_ComputerSystem).UserName показывает Федя Петров

Это достаточно странно...
Я проверял на win10 x64 LTSB и на Win7 x64 в виртуалке...
Во всех вариантах новое имя, в принципе, нигде не присутствует в win32_coputersystem, там есть только имя профиля ComputerName\UserNameFirst, которое отображается после команды (gcim Win32_ComputerSystem).username. Даже после нескольких переименований.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 18:00 20-03-2019
westlife



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

Цитата:
Это достаточно странно...
Я проверял на win10 x64 LTSB и на Win7 x64 в виртуалке...  

Я делал на 1809 LTSC. Видимо там что-то изменили. Привязка к SID исключает все проблемы.
Я поэтому все стараюсь писать конкретные явные параметры для функций, а не пускать все в подряд по конвееру, чтобы когда в PS или системе что то поменяют, потом не думать как исправить неработающие действия в тонне кода.

Всего записей: 1483 | Зарегистр. 12-12-2006 | Отправлено: 18:15 20-03-2019
YuS_2



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

Цитата:
увидел, прочитал, сделал так

Ну, вот, собственно:

 
westlife

Цитата:
Я делал на 1809 LTSC. Видимо там что-то изменили.

Если это так, то безбашенные индусы совсем с катушек слетели... WMI столько лет и в стольких версиях ОС, работало по одному принципу, а в очередной версии windows 10 (по сути одна ведь линейка), они решили внести изменения... дурь у них забористая, одним словом.

Цитата:
Привязка к SID исключает все проблемы.

Таким вот образом, как мы выяснили по классу win32_coputersystem, привязка к SID тоже ничего не гарантирует... ибо в следующей версии может всё измениться, например, номер SID при переименовании.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 18:43 20-03-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Для уточнения:
$LoginUserName = (Get-CimInstance -ClassName Win32_ComputerSystem).UserName | Split-Path -leaf
 
YuS_2 win10 x64 LTSB и на Win7 x64 — при переименовании учётки возвращает имя совпадающее с именем папки?
westlife 1809 LTSC — при переименовании учётки возвращает имя НЕсовпадающее с именем папки?
 
 
 
 
 
Добавлено:
В качестве сниппета, для новых powershelloff запрос пользовательского выбора

Код:
<#
    PSHostUserInterface.PromptForChoice(String, String, Collection<ChoiceDescription>, Int32) Method (System.Management.Automation.Host)
    Microsoft Docs — https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.host.pshostuserinterface.promptforchoice?view=powershellsdk-1.1.0
#>
 
# Коллекция типа [ChoiceDescription] [string]Подпись, [string]Справка
# & — перед знаком, на который нужно будет нажать для выбора
[System.Management.Automation.Host.ChoiceDescription[]]$ChoiceDescriptionCollection = @(
    [System.Management.Automation.Host.ChoiceDescription]::new("&Лейбл", "Справка"),
    [System.Management.Automation.Host.ChoiceDescription]::new("Лей&бл", "Справка")
)
 
$Caption = "Заголовок"
$Description = "Описание"
$DefaultChoice = 1 # Значение по умолчанию $ChoiceDescriptionCollection[индекс] с нуля
 
switch ($Host.UI.PromptForChoice($Caption, $Description, $ChoiceDescriptionCollection, $DefaultChoice)) {
    0 { "Вы выбрали первый пункт" }
    1 { "Вы выбрали второй пункт" }
    Default { "Что то пошло не так" }
}

Всего записей: 3650 | Зарегистр. 16-08-2012 | Отправлено: 19:36 20-03-2019
LevT



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

Цитата:
Что говорят лучшие практики по поводу using namespace грешно?

 
Очень даже наоборот.
Я вижу, ты проникся их духом  
 
 
 
 
Добавлено:
YuS_2

Цитата:
Таким вот образом, как мы выяснили по классу win32_coputersystem, привязка к SID тоже ничего не гарантирует... ибо в следующей версии может всё измениться, например, номер SID при переименовании.  

 
Зря остришь мрачно.
Разница есть
Да и SID поменять не то, что юзера переименовать. К SID-у много чего привязано.
Уникальным идентификатором принципала безопасности является именно SID, а не имя.
 
Так что контракт для SID-а вынужден реалиями предметной области,  
а контракт для содержимого классов WMI - удобная/самоуспокоительная выдумка тех, кто эти классы использовал.
Скорее всего старое содержимое не документировано даже для старой винды, а уж новая точно "не обещала жениться".
 

Всего записей: 17741 | Зарегистр. 14-10-2001 | Отправлено: 20:11 20-03-2019 | Исправлено: LevT, 20:31 20-03-2019
westlife



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

Цитата:
Для уточнения:
$LoginUserName = (Get-CimInstance -ClassName Win32_ComputerSystem).UserName | Split-Path -leaf
 
YuS_2 win10 x64 LTSB и на Win7 x64 — при переименовании учётки возвращает имя совпадающее с именем папки?
westlife 1809 LTSC — при переименовании учётки возвращает имя НЕсовпадающее с именем папки?  

Да, но привязка к SID работает в обоих случаях. И скорее всего будет работать в любом случае. Так как к SID измененному или нет, будет привязана папка профиля, и имя не играет роли вообще.
Но самое важное помнить про параметры для HKCU, про который привел пример.

Всего записей: 1483 | Зарегистр. 12-12-2006 | Отправлено: 20:38 20-03-2019
PhoenixUA



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21
Я такое как функцию использую для if'ов:
 

Код:
function IsConfirmed ( [string]$question, [int]$defaultchoice=1 ) { # 0 - ja, 1 - nein; 1 wenn nicht vorhanden
     
    $options = [System.Management.Automation.Host.ChoiceDescription[]] @("&Yes", "&No")
    $result = $host.ui.PromptForChoice("", $question, $options, $defaultchoice)  
    return !$result
}
 

Всего записей: 2184 | Зарегистр. 17-11-2005 | Отправлено: 21:26 20-03-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 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