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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » PowerShell

Модерирует : KLASS, IFkO

KLASS (06-03-2018 00:43): Объединение тем по сценариям: Сценарии Windows
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

Uriu

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

PowerShell 1.0 -  На текущий момент совершенно неактуальная версия, интересная только для истории. /Прямые ссылки/
PowerShell 2.0 и WinRM 2.0 - Последняя версия, работающая на Windows XP и Windows 2003 (Ещё) /Прямые ссылки/
PowerShell 3.0 (Windows Management Framework 3.0)
PowerShell 4.0 (Windows Management Framework 4.0)
PowerShell 5.0 (Windows Management Framework 5.0)
PowerShell 5.1 (Windows Management Framework 5.1)
PowerShell Core 6.0 (не заменяет PowerShell 5.1)



Ассоциация

Что бы ассоциировать скрипты с PowerShell, аналогично выполнению .bat/.cmd-файлов
нужно в командной строке набрать следующую команду(ы)
Версии 1.0-5.1 для 32-битных ОС: ftype microsoft.powershellscript.1=%windir%\system32\windowspowershell\v1.0\powershell.exe -file "%1"  
%*
 
Версии 1.0-5.1 для 32-битных ОС: ftype microsoft.powershellscript.1=%windir%\sysWOW64\windowspowershell\v1.0\powershell.exe -file "%1"  
%*
 
Версия 6.0 дя 32-битной ОС: ftype microsoft.powershellscript.1="C:\Program Files (86)\PowerShell\6.0.0\pwsh.exe"  -file "%1" %*
Версия 6.0 дя 64-битной ОС: ftype microsoft.powershellscript.1="C:\Program Files\PowerShell\6.0.0\pwsh.exe"  -file "%1" %*



вопрос о подписи скриптов

Что бы PowerShell не задавал вопрос о том, что скрипты не подписаны, ввести в нем команду
set-executionpolicy unrestricted
или в командной строке
powershell Set-ExecutionPolicy Unrestricted -force
(для этих 2-х действий требуются административные права)



Прочее


  • Если используете "белый список" в брандмауэре Windows, то для работы сценариев в сети необходимо создать 2 исходящих правила для svchost.exe и PowerShell.exe.
  • В отличие от батников кодировка скриптов на PowerShell должна быть 1251 (ANSI)




Расширение возможностей PowerShell
Функции
* Write-Color
* PowerTab --- Расширение функций клавиши Tab
Провайдеры
Готовые скрипты
* Ошибки и предупреждения в журнале событий по электронной почте (в4.0)
 


Работа со сценариями в Windows PowerShell
Раздел в MSDN
Краткие справочники по Windows PowerShell 3.0 (english)
Windows PowerShell Франк Кох (БЕРН)  Разработчик и пропагандист платформы. На русском языке в формате pdf и doc

Всего записей: 340 | Зарегистр. 25-11-2004 | Отправлено: 07:13 23-03-2006 | Исправлено: KapralBel, 09:31 29-01-2018
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вредный (и неправильный по причине вредности) одноcтрочник выглядит так:
 

Код:
 
"$root/*/aaaa" | gci -di -pv afolder | %{
       $afolder | gci -rec | mi -de $afolder.psparentpath
}
 

 
-PipelineVariable это способ избежать лишнего "приземления" (и начала новой трубы)
Иногда бывает уместен, потому что не засоряет пространство имён (-pv переменная умирает вместе с породившей её трубой)
 
 
использование псевдонимов допустимо только в личной одноразовой кухне.
Если хочешь понять хотя бы сам, что накалякал через пару месяцев опосля - изволь раскрывать алиасы:
 

Код:
 
$filesystem_filter = "$root/*/aaaa"  
$filesystem_filter |  
        Get-ChildItem -Directory -PipelineVariable afolder | Foreach-Object {
                $afolder | Get-ChildItem -Recourse | Move-Item -Destination $afolder.PSParentPath
        }
 

Потенциальные инженеры должны такое уметь свободно хотя бы читать!  
Это несложно: язык почти человеческий. А ещё и подсветка есть.
 
Имя переменной в PS начинается с буквы, а не $
$ - операция разыменования  
(принимает "приземлённое" имя и выдаёт живое содержание: колллекцию объектов внутри powershell.exe)
 

Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 00:29 21-08-2017 | Исправлено: LevT, 10:17 21-08-2017
LevT



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

Минимально годная повторно используемая функция (Tool в терминологии Джонса)
 

Код:
 
function Move-FolderContentsUp {
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline)]
        [DirectoryInfo]$folder
    )
    Write-Verbose ("Moving the contents of {0}" -f $folder.Path)
    $folder | Get-ChildItem -Recourse | Move-Item -Destination $folder.PSParentPath  
}
 

 
А вот контроллер, её использующий

Код:
 
$filesystem_filter = "$root/*/aaaa"  
$filesystem_filter |  
        Get-ChildItem -Directory -PipelineVariable afolder | Foreach-Object {  
                $afolder | Move-FolderContentsUp  
        }  
 

 
TODO:
К функции надо бы добавить comment based help
и обложить её Pester-тестами
(это такой инструмент автоматически подёргать её с разными входными данными и убедиться в том, что результат всегда совпадает с ожидаемым;
крутые как яйца программеры сначала пишут тесты, а потом саму функцию)
 
Контроллер шибко хитрый получился: инженерам-то радость, но чтобы передать такое "работягам" (неспособным воткнуть в help Get-ChildItem -full , а то и в язык filesystem_filter )  
можно извлечь из него ещё один документированный Tool, выбирающий нужные папки.  

Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 10:17 21-08-2017
LevT



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

Код:
 
function Move-FolderContentsUp {  
    [CmdletBinding()]  
    param(  
        [Parameter(ValueFromPipeline)]  
        [System.IO.DirectoryInfo[]]$folder  
    )  
    BEGIN {}
    PROCESS {
        foreach ($fold in $folder) {
            Write-Verbose ("Moving the contents of {0}" -f $fold.Path)  
            $fold | Get-ChildItem -Recurse | Move-Item -Destination $fold.PSParentPath  
         
        } #foreach
    } #PROCESS
    END {}
}
 

 
 
ТАДАММММММ!
Искомый "работягой" скрипт свёлся к  
 

Код:
 
$filesystem_filter = "$root/*/aaaa"  
$filesystem_filter |  
        Get-ChildItem -Directory |  
                Move-FolderContentsUp  
 

 
Добавлено:
 
Что произошло?
Мы освободили работягу от перечисления найденных папок.
Оно при этом никуда не делось, а переместилось в наш инструмент.
 

Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 18:27 21-08-2017 | Исправлено: LevT, 11:45 22-08-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Благодаря рантайму powershell "работяга" управляет окружающей реальностью (в данном случае файловой системой) буквально на человеческом языке.  
Мысль воплощается в исполняемую команду:  
 
по заданнному фильтру  
            получить папки,  
                        их содержимое сдвинуть вверх

 
Исчезает "Семантическая яма" между воспринимаемым миром и миром, поддающимся управлению.  
 
Закрыть эту дырку с самого начала целил изобретатель пошика Сновер в Monad Manifesto.
Сравните с программированием на стеках и проч. подобным...
 
Благодаря предоставленному нами-инженерами инструменту (reusable Tool), работяге не надо знать даже того, как организовать цикл!  
Не надо выбирать способы это сделать
 
 
--
Чтобы освободить работягу также и от ответственности за выбор правильного фильтра, можно написать другого рода скрипт: Controller
 
Ясно, чем эта штука должна являться:  
нечто интерактивное (с сохраняемой где-то конфигурацией или без неё),  
задаёт вопросы (ограничивает свободу работяги неправильно выразить свои намерения)  
переводит добытую информацию на язык filesystem_filter
 
 
Добавлено:
 
Ясно, что контроллер тесно связан с конкретным контекстом.
То есть конкретной задачей или классом задач, которые должен запускать наш работяга.
 
Получается, что можно и обойтись без отдельного контроллера -  
 если работяга достаточно образован,  
 а ресурсов (времени например) на написание ограничивающих его свободу костылей у инженеров нет.  
 
Это как раз тот частый случай, когда инженер и работяга в одном лице.
Однако, стоит спросить себя: легко ли я смогу воспользоваться своим скриптом, если опять приспичит через полгода, а голова будет занята другим?
 
Чем важнее гарантировать будущее, тем важнее соблюдать дисциплину скриптописательства toolmaking (инструментоваятельства)

Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 11:45 22-08-2017 | Исправлено: LevT, 12:11 22-08-2017
DVall



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

Код:
$Assembly = Add-Type -AssemblyName System.Web
[System.Web.Security.Membership]::GeneratePassword(30, 8)|Out-File -FilePath pass.txt -Encoding ASCII

Но в файл в конце добавляется 0D0A
Как можно убрать перевод строки?

Всего записей: 2599 | Зарегистр. 21-09-2001 | Отправлено: 12:58 22-08-2017 | Исправлено: DVall, 12:58 22-08-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DVall
попробуйте добавить -NoNewLine  
 
 
Добавлено:
Кстати, а какова дальнейшая судьба этого файла?  
Как он должен использоваться?

Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 13:17 22-08-2017 | Исправлено: LevT, 13:21 22-08-2017
DVall



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не циркулирует, вроде сей параметр появился в 5.
А у меня 2, будет работать на сервере 2003
 
Формироваться скрипт -> SSH
Вот сижу и подбираю SSH клиента со скриптами.....
 
Добавлено:
Переписал по другому и всё заработало.

Код:
$Assembly = Add-Type -AssemblyName System.Web
[System.IO.File]::WriteAllText("pass.txt",[System.Web.Security.Membership]::GeneratePassword(30, 8),[System.Text.Encoding]::ASCII)

Всего записей: 2599 | Зарегистр. 21-09-2001 | Отправлено: 13:45 22-08-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DVall
Вариант прочесть получившийся файл как строку и откусить от неё конец я отметаю как бредовый!
 
Дело в том, что все командлеты Out- предназначены для выдачи результатов вовне powershell с акцентом на восприятие человеком.
например, результат Out-File зависит ещё и от длины строки PS хоста, и от вручную заданной -Width  
 
Если надо сериализовать образовавшийся в конце трубы результат, отправьте его дальше в ConvertTo-*, а затем сторонним программам
Если надо сохранить в файл, используйте Export-Сlixml (для простых объктов годится Export-Csv).

Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 14:13 22-08-2017
DVall



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

Всего записей: 2599 | Зарегистр. 21-09-2001 | Отправлено: 14:15 22-08-2017
LevT



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

Цитата:
Переписал по другому и всё заработало.  

Только это уже не совсем повершел, а дотнет.
 
Сделать-то можно что угодно на чём угодно.  
Но вот нужно ли?
 
 
Добавлено:
Если файл предназначен не для человеческих глаз, а для программ, Out-File инструмент неуместный.
Вместо такого насилия над PS лучше использовать инструменты годные (которые есть и в PS, и вне его).
 
 

Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 14:17 22-08-2017 | Исправлено: LevT, 14:41 22-08-2017
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть список ссылок для скачивания архивов
Строка:

Код:
Import-CSV C:\soft.txt | Start-BitsTransfer

работает и все прилетает на комп.
Как сказать сабжу, чтобы качал только измененные на серверах файлы, если файл не изменился то проходим мимо?

Всего записей: 11112 | Зарегистр. 12-10-2001 | Отправлено: 11:10 26-08-2017
DVall



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

Цитата:
Если файл предназначен не для человеческих глаз, а для программ, Out-File инструмент неуместный.  
 Вместо такого насилия над PS лучше использовать инструменты годные (которые есть и в PS, и вне его).  

Не для программ, для cmd.
Почему? И чем это не годно если работает?
Зачем что-то наворачивать если 2 строчки работают?
И самое главное, PS не выше 2
 
 

Всего записей: 2599 | Зарегистр. 21-09-2001 | Отправлено: 11:21 26-08-2017
LevT



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

Цитата:
Не для программ, для cmd.  

 
Out-File выдаёт результат, извращённый для человеческого восприятия.
Как ты сам убедился.
Чтобы результат удобно прочла программа cmd, ты сам придумал отказаться от Out-File в пользу дотнетовского вызова.
 
С чем споришь-то?
Я всего лишь обобщил этот опыт в правило, которому можно следовать, не изобретая каждый раз велосипед.
 
 

Цитата:
И самое главное, PS не выше 2  

 
Я уже не помню, там не было Export-CSV или ConvertTo-CSV?
 
CSV - худо-бедно формат для структурированной информации (предназначенной программам). Есть форматы получше, но этот самый простенький и иногда достаточный.
Out- коммандлеты выдают информацию форматированную (предназначенную человеку, и потому извращенную с учётом удобства восприятия).
 
 
 
Добавлено:
KLASS
 
В хелпе к модулю BitsTransfer нет никаких намёков на поставляемый вместе с ним фильтр скачиваемого?
Если вдруг найдётся стороннний готовый модуль для сравнения локальных и удалённых ссылок - то всё-таки везуха.
 
Иначе остаётся самостоятельно отфильтровать содержимое трубы перед стартом трансфера.  
С этим автоматически справится powershell, если дать ему правило фильтра, т. е. уточнить, как именно отбрасываются ссылки, которые не надо перезакачивать.
 
Таков алгоритм решения задачи на PS.

Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 15:15 26-08-2017 | Исправлено: LevT, 15:50 26-08-2017
DVall



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

Цитата:
Out-File выдаёт результат, извращённый для человеческого восприятия.  
 Как ты сам убедился.  

Ничего не убедился.
В чём извращение?
Меня всё устраивало кроме новой строки.
 

Цитата:
С чем споришь-то?  
 Я всего лишь обобщил этот опыт в правило, которому можно следовать, не изобретая каждый раз велосипед.
 

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

Цитата:
Дело в том, что все командлеты Out- предназначены для выдачи результатов вовне powershell с акцентом на восприятие человеком.

Потом

Цитата:
Out-File выдаёт результат, извращённый для человеческого восприятия.


Всего записей: 2599 | Зарегистр. 21-09-2001 | Отправлено: 15:49 26-08-2017
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Справку не скачивал, переводить неудобно, у мелких есть, но про фильтр не а.
А фильтр нужен, если дата на сервере новей, чем локальный архив, то качаем. А вот как это реализовать в пошике пока не ведаю.

Всего записей: 11112 | Зарегистр. 12-10-2001 | Отправлено: 15:59 26-08-2017 | Исправлено: KLASS, 16:00 26-08-2017
LevT



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

Цитата:
В чём извращение?  
Меня всё устраивало кроме новой строки.  

 
ЛюдЯм нужны новые строки, отступы, выделения заголовками, красивыми табличками и тп.
А для передачи программам нужна структура, которую адаптация вывода программы к человеческому восприятию только портит.
(для систематического решения этой проблемы - обратной закачки инфы из "отчётов" в базы данных - были придуманы  непростые инструменты "ETL")
 
Ты в этом убедился на собственном опыте, изложенном выше на этой странице.
Но эмоционально реагируешь на какие-то маркеры в моих словах.
 
 
Добавлено:
KLASS

Цитата:
А фильтр нужен, если дата на сервере новей, чем локальный архив, то качаем.  

 
А дата на сервере как определяется?
 
"You cannot use the WebClient class to check remote file timestamp."
 
Добавлено:
Unless there is a timestamp embedded somewhere within the content of the web page, you're pretty much out of luck.  The only timestamp returned in the HTTP header is related to caching currency and not file age.  Now if the same site allows FTP access with directory listing enabled, it will return a file timestamp.

Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 16:04 26-08-2017 | Исправлено: LevT, 16:36 26-08-2017
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Как то же дату файла на сервере определяет Wget и качает на комп только то, что новее.

Всего записей: 11112 | Зарегистр. 12-10-2001 | Отправлено: 16:34 26-08-2017
LevT



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

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

Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 16:42 26-08-2017 | Исправлено: LevT, 16:42 26-08-2017
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Заинтересованная сторона надцать лет юзала wget, но что-то часто на форуме
(не будем показывать пальцем кто) говорят, что велик пошик.

Всего записей: 11112 | Зарегистр. 12-10-2001 | Отправлено: 16:51 26-08-2017
LevT



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

Цитата:
Меня всё устраивало кроме новой строки.  
 

 
Не устроившая тебя новая строка - лишь верхушка айсберга, работающего в коммандлетах Out-*. Ненужного и вредного для передачи данных программам.
 
Однако есть исключение, которое подтверждает это правило.
Out-GridView -PassThru

Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 16:55 26-08-2017
   

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

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » PowerShell
KLASS (06-03-2018 00:43): Объединение тем по сценариям: Сценарии Windows


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru