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

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



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

Цитата:
Только вот там нету решения, вряд ли получится - это не ответ  

там описание того, что отправляя массив в конвейер, ты запускаешь свою функцию столько раз, сколько объектов в массиве...  
Решение
1. перестройка функции (по сути костыль, но решение возможно)
2. изменение способа вызова (естественное решение, при существующей уже функции)
3. формирование вместо массива хэштаблицы (в виду того, что в конвейер она передается целиком, а не по одному элементу)
 

Цитата:
Костыль не рабочий.

А вот это уже наезд... показать скрины? Ты ведь не показываешь ничего... другими словами - у меня он ведь рабочий. ЧЯДНТ?
 

Цитата:
Да и where {$_.IsOnline} | select -first 1

это уже частности... можно, конечно, и так.
 

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

Я как тот Станиславский - не верю!

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 15:47 06-02-2021
iNNOKENTIY21



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

Цитата:
А вот это уже наезд... показать скрины?  

Всё таки ты не выспался
iNNOKENTIY21
Цитата:
Костыль не рабочий. Разве, что, при нерабочих серверах, которые можно по пальцам одной руки незадачливого токаря пересчитать
Полная цитата с объяснением когда костыль можно считать не рабочим, а именно когда мало серверов, а если их много... По сути - не рабочий костыль, ибо в задаче основным и было избежать лишних проверок, а вернуть первый же рабочий сервер.
 
 

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



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

Цитата:
Всё таки ты не выспался


Цитата:
Полная цитата с объяснением когда костыль можно считать не рабочим, а именно когда мало серверов, а если их много...

Да нет же, я в первом же ответе всё достаточно ясно описал. Претензии к работе конвейера - не по адресу.
Костыль  рабочий, как раз. Но именно потому и костыль, что все его недостатки - на виду.
Если таки требуется именно конвейер, то используй способ 2 или 3 отсюда  Цитата
Других вариантов не существует, в такой вот реализации...
А почему требуется именно способ вызова функции через конвейер?  
Чем не устраивает вызов с параметрами?
Кроме того, что просто "хочу", естественно.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 16:12 06-02-2021
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS 2
Как же можно признать код рабочим, если он не соответствует поставленной задаче
Потому что пошик, конвейер удобно, function Get-Servers {return @("example10.com","bing.com","google.com")} | Test-Servers -FirstOnline | Connect-Server
Всё в мире от хочу и любопытненько

Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 16:39 06-02-2021
LevT



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

Код:
 
 $firstavailable = "no one available"
 
 $servers | % {
    if (Test-Connection $_ -Count 1 -Quiet) {$firstavailable = $_; break}
 }
 
 $firstavailable
 

 
 
Добавлено:
 
В 5.1 Test-Connection принимает из трубы только это  
 

Код:
 
    -ComputerName <System.String[]>
        Specifies the computers to ping. Type the computer names or type IP addresses in IPv4 or IPv6 format. Wildcard characters are not permitted. This parameter is required.
         
 
        Required?                    true
        Position?                    0
        Default value                None
        Accept pipeline input?       True (ByPropertyName)
        Accept wildcard characters?  false
 

 
В pwsh доработали

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 16:45 06-02-2021 | Исправлено: LevT, 16:53 06-02-2021
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Не смог в функцию, но
Код:
if (Test-Connection $_ -Count 1 -Quiet) {$firstavailable = $_; break}  
натолкнуло на мысль:
 
решение:

Код:
function Test
{
    param
    (
        [Parameter(Mandatory, ValueFromPipeline)]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $Servers,
 
        [switch]
        $FirstOnline
    )
 
    process
    {
        if ($FirstOnline)
        {
            if (Test-Connection $_ -Count 1 -Quiet) {$_ ; break}
        }
        else
        {
            [pscustomobject] @{
                Server   = $_
                IsOnline = Test-Connection -ComputerName $_ -Count 1 -Quiet
            }
        }
    }
}
 
$servers = "example10.com","bing.com","yandex.com","example10.com","example.com"
$servers | Test -FirstOnline

Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 17:22 06-02-2021
YuS 2



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

Цитата:
решение:

Ну, вот бряком и решилось... остался не решенным один момент:

Код:
Test $servers -FirstOnline


 
Добавлено:
iNNOKENTIY21

Цитата:
Как же можно признать код рабочим, если он не соответствует поставленной задаче

в правильно поставленной задаче содержится 50% решения
 
Добавлено:
iNNOKENTIY21

Цитата:
Потому что пошик, конвейер удобно, function Get-Servers {return @("example10.com","bing.com","google.com")} | Test-Servers -FirstOnline | Connect-Server

именно потому, что пошик, непонятно почему не:

Код:
function Get-Servers {return @("example10.com","bing.com","google.com")}
Test-Servers (Get-Servers) -FirstOnline | Connect-Server

в чем необходимость другого варианта? "Хочу" и "Любопытно" - варианты понятные, но если отсутствует возможность, то зачем в стену-то головой? Есть же дверь...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 17:41 06-02-2021 | Исправлено: YuS 2, 17:58 06-02-2021
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кстати
обсуждение темы форумного нугет-репозитория закончилось тем, что некому его хостить.
 
Вот отличная альтернатива для распространения скриптов и не только их:
https://github.com/lukesampson/scoop/wiki/Buckets
https://scoop.sh/
 
"Бери да делай", не надо ни с кем согласовывать.
 
Китайцы и тут впереди  
  https://github.com/kkzzhizhou/scoop-zapps

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 18:11 06-02-2021 | Исправлено: LevT, 18:13 06-02-2021
YuS 2



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

Цитата:
решение:

в окно, вместо двери

Код:
function Test {
    param (
        [Parameter(ValueFromPipeline)]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $Servers = @("example10.com","google.com","bing.com","yandex.com"),
 
        # Если указан, оффлайн не возвращать, вернуть, первый же онлайн сервер,
        # дальше не проверять, выйти из функции.
        [switch]
        $FirstOnline  
    )
    process {
        foreach ($serv in $Servers) {
            if($global:flag){break}
            $IsOnline = Test-Connection -ComputerName $serv -Count 1 -Quiet
            $var = [pscustomobject] @{
                Server = $serv
                IsOnline = $IsOnline
            }
            if ($FirstOnline) {
                if ($IsOnline) {
                    $global:flag = $true
                    return $var
                }
            } else { $var }
        }
    }
}
 
# Должно работать при обоих вызовах
$arr = "example10.com","bing.com","google.com"
$global:flag = $false
 
$arr | Test -FirstOnline
 
#Test $arr -FirstOnline|ogv

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 18:16 06-02-2021 | Исправлено: YuS 2, 18:24 06-02-2021
iNNOKENTIY21



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

Цитата:
остался не решенным один момент:  
Энто то известно в предыдущих постах.. foreach

Цитата:
в правильно поставленной задаче содержится 50% решения
100% и таки нашлось

Цитата:
если отсутствует возможность, то зачем в стену-то головой? Есть же дверь...
есть же возможность, я про неё не знал просто и не только я Почти знал, но не срабатывало чего то

Цитата:
именно потому, что пошик, непонятно почему не:  
Выбор есть хорошо

Код:
function Test-Servers
{
    param
    (
        [Parameter(Mandatory, ValueFromPipeline)]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $Servers,
 
        [switch]
        $FirstOnline
    )
 
    begin
    {
        $TestServer = { param($i) Test-Connection -Comp $i -Count 1 -Quiet }
    }
 
    process
    {
        if ($FirstOnline)
        {
            foreach ($serv in $Servers)
            {
                if (& $TestServer $serv) {$serv ; return} # если break process скрипт на этом останавливается?? если return то $servers | Test-Servers -FirstOnline неправильно отрабатывает
            }
        }
        else
        {
            foreach($serv in $Servers)
            {
                [pscustomobject] @{
                    Server   = $serv
                    IsOnline = & $TestServer $serv
                }
            }
        }
    }
}


Код:
$servers = "example.com","example1.com","example2.com","example3.com","example4.com","example5.com"
 
#Test-Servers -Servers $servers
#Test-Servers -Servers $servers -FirstOnline
#$servers | Test-Servers
$servers | Test-Servers -FirstOnline

Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 18:40 06-02-2021 | Исправлено: iNNOKENTIY21, 16:22 07-02-2021
YuS 2



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

Цитата:
100% и таки нашлось

не, 100% - перебор, это уже не задача, а готовое решение
 

Цитата:
я про неё не знал просто и не только я

не то, чтобы не знал... не было необходимости, скорее... обычно бряками циклы останавливал, а здесь попробовал и не сработало, полез в документацию, а там фига с маслом...
В общем, выбор, это хорошо, да.
 
Можно флагом бряк запускать и необязательно глобальным (как выше в коде), а просто в begin его объявить...

Код:
function Test {
    param (
        [Parameter(ValueFromPipeline)]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $Servers = @("example10.com","google.com","bing.com","yandex.com"),
        [switch]
        $FirstOnline  
    )
    begin {$flag = $false}
    process {
        foreach ($serv in $Servers) {
            if($flag){break}
            $IsOnline = Test-Connection -ComputerName $serv -Count 1 -Quiet
            $var = [pscustomobject] @{
                Server = $serv
                IsOnline = $IsOnline
            }
            if ($FirstOnline) {
                if ($IsOnline) {
                    $flag = $true
                    return $var
                }
            } else { $var }
        }
    }
}
 
$arr = "example10.com","bing.com","google.com"
 
 
$arr | Test -FirstOnline
 
#Test $arr -FirstOnline|ogv

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 19:03 06-02-2021 | Исправлено: YuS 2, 19:04 06-02-2021
LevT



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

Задолбал глюк синей PS 5.1 консоли с большими буквами.  
Например, они аккуратно пропадают при вставке туда команды.
 
Кто виноват, и что делать?  
   (кроме не пользоваться этой консолью, эпизодически всё равно приходится..)

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 09:33 07-02-2021
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Я задавал вопрос на GitHub. Надо обновить PSReadLine до последней версии. В 5.1 установлена старая
https://github.com/farag2/Utilities/blob/ead9c6d07dd82b88953a65d6388318d688e5f7fd/Windows%20Terminal/Settings.ps1#L10
 
https://github.com/PowerShell/PSReadLine

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 11:17 07-02-2021 | Исправлено: farag, 11:18 07-02-2021
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
farag
 
ну я так и думал.
Вот только readline до сих пор не осилил, есть и есть.. одни проблемы доставляет.
 
Впрочем, и терминал не настраивал, пользуюсь как есть из коробки.
Так что благодарности, если объяснишь как воспользоваться твоими настройками.

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 12:19 07-02-2021
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Ну конкретная ссылка была дана, так как там используется скачивание PSReadLine в целях обновления последнего. Работает оно, очевидно, только в powershell.exe.
Настройки созданы, чтобы запустить на текущем терминале и сделать его так, как мне удобно. Да и показать, как парсить JSON и настройки терминала, чтобы люди под себя могли настроить.
Запуск такой: создать файл со скриптом и запустить (можно прямо на текущем Terminal, так как он на лету подхватывает настройки без перезагрузки). Вот если PSReadLine будет устаревшей, то тогда скрипт остановится, и надо будет закрыть любые консоли PS. И запустить заново. Еще баг в Terminal: при добавлении своих значений через скрипт иногда эта значения, записываясь в конфиг Terminal, съезжают вниз, и на конце, соответственно, у них остается запятая вместо ничего, и скрипт при парсинге остановится с ошибкой, что JSON невалидный. Придется открыть конфиг и найти запятую на конце лишнюю.
 
Но это уже скорее спорт, так как с релизом версии 1.6 (стабильной) будет графические настройки.
https://habr.com/ru/company/microsoft/blog/540404/
 
 

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 14:29 07-02-2021
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в function Test-Servers произведена замена
Версия с флагом лучше или тоже самое, так
 

Цитата:
Задолбал глюк синей PS 5.1 консоли с большими буквами.  
Например, они аккуратно пропадают при вставке туда команды.  

Я строчкой, немного монструозной, обхожусь

Код:
Set-ExecutionPolicy RemoteSigned -Confirm:$false -Force ; Install-Module -Name PowerShellGet -Force -Confirm:$false ; exit & start powershell -ArgumentList '-noexit','-noprofile', '-command "Install-Module PSReadLine -Force -SkipPublisherCheck -Confirm:$false ; exit & start powershell"'
Строка разрешает исполнение локальных скриптов, ставит свежий модуль PowerShellGet и по надобности свежий nuget, модуль PSReadLine, в конце открывается готовая к работе консоль powershell.
Должны быть закрыты все консоли powershell, включая terminal, ise, vscode... открыта толкьо одна, с правами администратора, куда и вставляется строка выше.
В процессе будут закрываться и открываться консоли powershell.
Если будет необходим nuget свежий, будет запрос на подтверждение установки, соглашаемся.
Лучше запускать это сразу после установки системы. Я первым делом..

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



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

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 21:29 07-02-2021
insorg



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как можно штатными средствами cmd.exe или powershell получить количество установленой оперативной памяти?
Желательно в однострочном виде.
Что-то простое по аналогии с "echo %NUMBER_OF_PROCESSORS%", которое просто выдаст число.

Всего записей: 15809 | Зарегистр. 04-11-2010 | Отправлено: 17:29 09-02-2021 | Исправлено: insorg, 17:30 09-02-2021
iNNOKENTIY21



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

Цитата:
insorg: Как можно штатными средствами cmd.exe или powershell получить количество установленой оперативной памяти?  

CMD (для русской версии): systeminfo | find "Полный объем физической памяти"
CMD: wmic MEMORYCHIP get BankLabel, Capacity
PowerShell: (Get-WmiObject -class "cim_physicalmemory" | Measure-Object -Property Capacity -Sum).Sum /1gb
PowerShell: (Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb

Всего записей: 3504 | Зарегистр. 16-08-2012 | Отправлено: 18:17 09-02-2021
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
insorg
Ещё пища для размышлений: https://github.com/farag2/PC-information

Всего записей: 2474 | Зарегистр. 27-07-2009 | Отправлено: 18:40 09-02-2021
Открыть новую тему     Написать ответ в эту тему

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