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

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21
Вот такой получился proof of concept, так сказать. Хотелось настроить панель инструментов в Firefox, не трогая остальные иконки и не заменяя всю строку на заготовленную.

Код:
 
# Получаем имя профиля
$String = Get-Content -Path "$env:APPDATA\Mozilla\Firefox\installs.ini" | Select-String -Pattern "Default="
$Folder = Split-Path -Path $String -Leaf
 
$prefsjs = "$env:APPDATA\Mozilla\Firefox\Profiles\$Folder\prefs.js"
 
# Находим строку, где хранятся настройки панели управления
$String = Get-Content -Path $prefsjs | Select-String -Pattern "browser.uiCustomization.state" -SimpleMatch
# Удаляем в строке все "\"
$String2 = ($String).Tostring().replace("\", "")
# Удаляем в строке первые 44 символа, чтобы отбросить 'user_pref("browser.uiCustomization.state", "'
$Substring = $String2.Substring(44)
# Удаляем в строке последние 3 символа, чтобы отбросить '");'
[Object]$QuickJson = $Substring.Substring(0,$Substring.Length-3)
 
[object]$JSON = ConvertFrom-Json -InputObject $QuickJson
# Сохраняем необходимую последовательность кнопок
$NavBar = (
    # На предыдущую страницу
    "back-button",
    # На следующую страницу
    "forward-button",
    # Адресная строка
    "urlbar-container",
    # Домащняя страница Firefox
    "home-button",
    # Обновить текущую страницу
    "stop-reload-button",
    # Показать ваши закладки
    "bookmarks-menu-button",
    # Аккаунт Firefox
    "fxa-toolbar-menu-button"
)
$JSON.placements.'nav-bar' = $NavBar
$ConfiguredJSON = $JSON | ConvertTo-Json -Depth 10
# Заменяем все '"' на '\"', как было
$ConfiguredString = $ConfiguredJSON.replace('"', '\"').ToString()
 
# Заменяем всю строку на полученный результат
$replace = "user_pref(`"browser.uiCustomization.state`", `"$ConfiguredString`");"
(Get-Content -Path $prefsjs).replace($String, $replace) | Set-Content $prefsjs -Force
 

 
prefjs по умолчанию, если надо: https://pastebin.com/pFyAZe1R
 
Вопрос: можно как-то элегантнее решить задачу? Мне вот не направится что-то отбрасывание у меня 44 и 3 символов.

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



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

Цитата:
можно как-то элегантнее решить задачу? Мне вот не направится что-то отбрасывание у меня 44 и 3 символов.

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

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



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

Цитата:
Вопрос: можно как-то элегантнее решить задачу? Мне вот не направится что-то отбрасывание у меня 44 и 3 символов.

YuS 2 дело говорит, разбить найденную строку $String в хеш-таблицу, ключ=значение.
Универсально бы, дабы и для других строк в файле подходило, а не только к "browser.uiCustomization.state".
Я вот не дружу с регулярками, но знаю человека который дружит, во первых строках  
 
 
Добавлено:
Идея такая. регулярку может поправят

Код:
$prefsjs = "./prefs.js"
$prefName = "browser.uiCustomization.state"

$prefStr = ([string](Get-Content -Path $prefsjs | Select-String -Pattern $prefName -SimpleMatch)).Replace('\','')
[void]($prefStr -match "user_pref\(`"(.+)`", `"(\{.+\})`"\);")

$preferens = [pscustomobject] @{
   Name = $Matches[1]
   Value = $Matches[2]
}

if ($preferens.Value[0] -eq '{') {
   $prefJson = $preferens.Value | ConvertFrom-Json
} else {
   "Не json формат"
}

echo $prefJson.placements.'nav-bar'


Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 12:05 30-05-2020
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21
Здорово, конечно. Но длина имени переменной не изменяется уже давно, то уж так оставлю.

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



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

Цитата:
Но длина имени переменной не изменяется уже давно

Это никак не уменьшает вероятности такого изменения при внешнем воздействии на входящие данные, которые никак от скрипта не зависят.
То есть для универсальности, лучше использовать подход, предложенный iNNOKENTIY21
Только для большей универсальности, регулярку я бы изменил примерно на такую:

Код:
$null = $prefStr -match 'user_pref\s*\(\s*"\s*([^"]+)\s*"\s*,\s*"\s*(\{[^)]+\})\s*"\s*\);'

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

Цитата:
то уж так оставлю.

Звучит как "И так сойдет"
Но в программировании, это часто приводит к ситуации "вырванные годы" с бесцельно потраченной кучи времени впоследствии, при поиске бага, если вдруг внешние данные таки изменятся.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 15:37 30-05-2020 | Исправлено: YuS 2, 15:38 30-05-2020
iNNOKENTIY21



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

Цитата:
Здорово, конечно. Но длина имени переменной не изменяется уже давно, то уж так оставлю.  

Это же не только из за одной переменной, это концепт пруф с заделом на функцию парсинга, всего файла.
 
Например
 
Добавлено:
YuS 2
 
Вот совместить, сделать функцию для сохранения convertTo-FirefoxPrefsJS и будет profit

Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 15:41 30-05-2020
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
farag
Где то видел файл типа твоего win-10.ps1, только там еще был возврат настроек  или в дефолтное.
Не у тебя? Чего то найти не могу

Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 13:39 31-05-2020
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21
Я не делаю возврат. Но так как делаем GUI-версию, приходится по одному файлу для возврата стряпать. Я уже замучился просто один сидеть.

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 15:19 31-05-2020
LevT



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

Вопрос
 
http://forum.ru-board.com/topic.cgi?forum=33&topic=7685&start=320#13
 
???

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 16:12 02-06-2020
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть взаимно соотвествующие массивы $Urls и $files
 
$Job = Start-BitsTransfer -Source $Url -Destination $file  
 
Как запустить очередь таких BitsTransfer-ов, чтобы  
   - пропустить несуществующие урлы
   - скачать только первый  файл который ($Job.jobstate -like 'Trans*')?
   - на этом остановиться
 
?
 
Асинхронно не катит, потому что первым может начать качаться не нужный файл, а какой-то из последующих ненужных.
Ну и нефиг сервер зря долбать
 
Потратил уже слишком много времени сформулировать выход из цикла, прошу помощи
Собственно, файлы тут:

Код:
 
$destination = "C:\A\Work"
 
$version = '2_{0}_{1}'
$major = 72..71
$minor = 9..0
 
$strings = $major | foreach {
    $major = $_;  
    $minor.forEach({$version -f $major,$_})
}
 
$strings[0..18] | foreach {
    $URL = "http://download.contentgrabber.com/ContentGrabber/$PSItem/contentgrabber_$PSItem.zip"
    $file = Join-Path -Path $destination -ChildPath "ContentGrabber_$($PSItem).zip"
 
    $Job = Start-BitsTransfer -Source $Url -Destination $file #-ErrorAction SilentlyContinue
 
....
 


Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 02:09 03-06-2020 | Исправлено: LevT, 02:34 03-06-2020
iNNOKENTIY21



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

Цитата:
 - пропустить несуществующие урлы  

проверять их, как то, так:  
Код:
$strings[0..18] | foreach {
   $URL = "http://download.contentgrabber.com/ContentGrabber/$PSItem/contentgrabber_$PSItem.zip"
   $file = Join-Path -Path $destination -ChildPath "ContentGrabber_$($PSItem).zip"

   $res = Invoke-WebRequest -Uri $URL -Method Head -SkipHttpErrorCheck
   if ($res.StatusCode-eq 200 -and $res.RawContent.Contains("Content-Type: application/x-zip-compressed")) {
       "$URL --> $file"
   } else {
       "$URL --> false"
   }
}



 

Цитата:
- скачать только первый файл который ($Job.jobstate -like 'Trans*')?

Что такое: $Job.jobstate -like 'Trans* не знаю, а скачать первый: "$URL --> $file" заменить на команду загрузки после, чего break

Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 12:14 03-06-2020
LevT



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

Цитата:
Что такое: $Job.jobstate -like 'Trans* н

 
Transferring или Transferred
Спасибо, можно и так
 

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 12:39 03-06-2020
farag



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

Код:
 
function ConvertEncoding
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true)]
        [string]
        $Path,
 
        [Parameter(Mandatory = $true)]
        [ValidateSet("UTF8", "UTF8BOM")]
        [string]
        $Encoding
    )
 
    {
        # Конвертировать файл в кодировку UTF8 без BOM
        $Content = Get-Content -Path $Path -Raw
        Set-Content -Value (New-Object System.Text.UTF8Encoding).GetBytes($Content) -Encoding Byte -Path $Path
        # [System.IO.File]::WriteAllText($Path, $Content)
    }
 
 
    {
        # Конвертировать файл в кодировку UTF8 с BOM
        (Get-Content -Path $Path -Encoding UTF8) | Set-Content -Encoding UTF8 -Path $Path
    }
}
 
ConvertEncoding -Path D:\folder\file.txt -Encoding UTF8
 

 
А как в зависимости от -Encoding "включался" нужный кусок в функции?
 
Через switch только?

Код:
 
switch ($Encoding)
    {
        "UTF8"
        {}
    }
 

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 00:40 05-06-2020 | Исправлено: farag, 01:35 05-06-2020
YuS 2



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

Цитата:
Через switch только?

Через переключатель или через условный блок... без разницы

Код:
if ($encoding -eq "UTF8"){...}else{...}

параметр принимает только два типа значений, так что...
 
ЗЫ Для powershell core v7.0 можно ещё и так:

Код:
1 -eq $true ? 'True' : 'False'

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



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

Цитата:
1 -eq $true ? 'True' : 'False'  

 
Не понял особо синтаксис. Можно пример?

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
farag
if (1 -eq $true) {"True"} else {"False"}

Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 18:38 05-06-2020
YuS 2



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

Цитата:
Не понял особо синтаксис. Можно пример?

это и был пример тернарного оператора...
<булево выражение> ? <результат если истина> : <результат если ложь>
 

Код:
$var1 = 1 -eq $true ? 'Истина' : 'Ложь'
$var2 = 0 -eq $true ? 'Истина' : 'Ложь'
$var1;'';$var2

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



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

Код:
 
function ShowMenu
{
    [CmdletBinding()]
    param
    (
        [Parameter()]
        [string]
        $Title,
 
        [Parameter(Mandatory = $true)]
        [array]
        $Menu,
 
        [Parameter(Mandatory = $true)]
        [int]
        $Default
    )
 
    Write-Output $Title
 
    $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))
}
 
$DriveLetters = @((Get-Disk | Where-Object -FilterScript {$_.BusType -ne "USB"} | Get-Partition | Get-Volume | Where-Object -FilterScript {$null -ne $_.DriveLetter}).DriveLetter | Sort-Object)
 
 
ShowMenu -Menu $DriveLetters -Default 0
 

 
Как вместо изменения фона выбранного пункта делать выбор квадратными скобками: [ ]. Я что-то совсем не дружу с -format. А у него так все завязано на @colors, что и не переделаешь.

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



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

Цитата:
Как вместо изменения фона выбранного пункта делать выбор квадратными скобками: [ ]

Разделение на выделенное/не выделенное, происходит в блоке if ($i -ne $y) {
Всё с color не нужно, и блок if else нужен только 1, в итоге заменить цикл foreach:
Код:
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++
        }  

на:
Код:
foreach ($item in $Menu)
        {
                if ($i -ne $y)
                {
                    Write-Host (' {0}. {1} ' -f ($i+1), $item)
                }
                else
                {
                    Write-Host ('[{0}. {1}] ' -f ($i+1), $item)
                }
 
            $i++
        }

 
 
Добавлено:
'[{0}. {1}] ' -f ($i+1), $item
слева от -f шаблон, справа значения
в шаблоне в фигурных скобках, индекс, вместо него будут подставятся значения, т.е. вместо {0} будет ($i+1), а вместо {1}  будет $item

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В ночь на воскресенье превращаюсь в    не спящего препода.

Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 10:39 07-06-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