Операторы перенаправления PowerShell
Операторы перенаправления позволяют отправлять потоки данных в файл или выходной поток SUCCESS.
Операторы перенаправления PowerShell используют следующие числа для представления доступных выходных потоков:
№ потока | Описание | Представлен в |
---|---|---|
1 | SUCCESS Stream | PowerShell 2.0 |
2 | ERROR Stream | PowerShell 2.0 |
3 | WARNING Stream | PowerShell 3.0 |
4 | VERBOSE Stream | PowerShell 3.0 |
5 | DEBUG Stream | PowerShell 3.0 |
6 | INFORMATION Stream | PowerShell 5.0 |
* | All Streams | PowerShell 3.0 |
В PowerShell также есть поток PROGRESS, но он не используется для перенаправления.
Ниже перечислены операторы перенаправления PowerShell, где n представляет номер потока. Поток SUCCESS (1) используется по умолчанию, если поток не указан.
Оператор | Описание | Синтаксис |
---|---|---|
> | Отправить указанный поток в файл. | n> |
>> | ДОБАВИТЬ указанный поток к файлу. | n>> |
>&1 | _Перенаправляет_ указанный поток в поток SUCCESS. | n>&1 |
В отличие от некоторых оболочек Unix, вы можете перенаправлять другие потоки только в поток SUCCESS.
Примеры:
Пример 1: Перенаправление ошибок и вывод в файл
dir 'C:\', 'fakepath' 2>&1 > .\dir.log
В этом примере dir запускается для двух элементов, один из который завершится успешно, а для другого — с ошибкой.
Он использует «2>&1» для перенаправления потока ERROR в поток SUCCESS и «>» для отправки результирующего потока SUCCESS в файл с именем dir.log.
Пример 2: Отправить все данные потока SUCCESS в файл
.\script.ps1 > script.log
Эта команда отправляет все данные потока SUCCESS в файл с именем script.log.
Пример 3. Отправка потоков Success, Warning и Error в файл
&{ Write-Warning "hello" Write-Error "hello" Write-Output "hi" } 3>&1 2>&1 > P:\Temp\redirection.log
В этом примере показано, как можно комбинировать операторы перенаправления для достижения желаемого результата.
- 3>&1 перенаправляет поток WARNING в поток SUCCESS.
- 2>&1 перенаправляет поток ERROR в поток SUCCESS (который теперь также включает все данные потока WARNING)
- > перенаправляет поток SUCCESS (который теперь содержит потоки WARNING и ERROR) в файл с именем C:\temp\redirection.log)
Пример 4: Перенаправить все потоки в файл
.\script.ps1 *> script.log
В этом примере все потоки выводятся из сценария с именем script.ps1 в файл с именем script.log.
Пример 5: Подавить все данные Write-Host и Information Stream
&{ Write-Host "Hello" Write-Information "Hello" -InformationAction Continue } 6> $null
В этом примере подавляются все данные Information Stream (информационного потока). Дополнительные сведения о командлетах потока INFORMATION смотрите разделах Write-Host и Write-Information.
Примечания:
1. Операторы перенаправления, которые не добавляют данные (> и n>), перезаписывают текущее содержимое указанного файла без предупреждения.
2. Однако, если файл доступен только для чтения, является скрытым или системным файлом, перенаправление ТЕРПИТ НЕУДАЧУ. Операторы перенаправления добавления (>> и n>>) не записывают в файл, доступный только для чтения, но они добавляют содержимое в системный или скрытый файл.
3. Чтобы принудительно перенаправить содержимое в доступный только для чтения, скрытый или системный файл, используйте командлет Out-File с его параметром -Force.
4. Когда вы пишете в файлы, операторы перенаправления используют кодировку Unicode. Если файл имеет другую кодировку, выходные данные могут быть отформатированы неправильно. Чтобы перенаправить содержимое в файлы, отличные от Unicode, используйте командлет Out-File с его параметром -Encoding.
5. Возможная путаница с операторами сравнения
Оператор «>» не следует путать с оператором сравнения Больше (часто обозначается как «>» в других языках программирования).
В зависимости от сравниваемых объектов вывод с использованием «>» может показаться правильным (поскольку 36 не больше 42).
if (36 > 42) { "true" } else { "false" } false
Однако проверка локальной файловой системы позволяет увидеть, что был создан файл с именем 42, а в него записано содержимое 36.
dir Mode LastWriteTime Length Name ---- ------------- ------ ---- ------ 1/02/20 10:10 am 3 42 cat 42 36
Попытка использовать обратное сравнение «<» (меньше чем) приводит к системной ошибке:
if (36 < 42) { "true" } else { "false" } At line:1 char:8 + if (36 < 42) { "true" } else { "false" } + ~ The '<' operator is reserved for future use. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : RedirectionNotSupported
Если требуется числовое сравнение, следует использовать -lt и -gt.
Сохранение и отзыв последних расположений (Push-Location и Pop-Location)
При изменении расположения полезно отслеживать свое предыдущее расположение и иметь возможность вернуться к нему. Командлет Push-Location в Windows PowerShell создает упорядоченный журнал («стек») путей к каталогам, которые вы открывали, чтобы можно было вернуться по нему на шаг назад, используя дополнительный командлет Pop-Location.
Например, Windows PowerShell обычно запускается в корневом каталоге пользователя.
PS> Get-Location Path ---- C:\Documents and Settings\PowerUser
Чтобы передать текущее расположение в стек, а затем переместить его в папку локальных параметров, введите:
Push-Location -Path "Local Settings"
После этого можно передать расположение локальных параметров в стек и переместить его в папку Temp, введя следующее:
Push-Location -Path Temp
Чтобы убедиться, что каталоги изменены, введите команду Get-Location.
PS> Get-Location Path ---- C:\Documents and Settings\PowerUser\Local Settings\Temp
После этого можно перейти в последний открытый каталог, введя команду Pop-Location, и проверить изменение, введя команду Get-Location.
PS> Pop-Location PS> Get-Location Path ---- C:\Documents and Settings\me\Local Settings
Как и в случае с командлетом Set-Location, можно включить параметр -PassThru при вводе командлета Pop-Location, чтобы открыть указанный каталог.
PS> Pop-Location -PassThru Path ---- C:\Documents and Settings\PowerUser
Кроме того, можно использовать командлеты расположения с сетевыми путями. Если у вас есть сервер FS01 с общей папкой Public, можно изменить расположение, введя
Set-Location \\FS01\Public
или диспетчер конфигурации служб
Push-Location \\FS01\Public
Чтобы изменить расположение на любой доступный диск, можно использовать команды Push-Location и Set-Location. Например, если у вас есть локальный дисковод компакт-дисков с буквой диска D, содержащий компакт-диск с данными, вы можете изменить расположение на него, введя команду Set-Location D: .
Если дисковод пуст, вы получите следующее сообщение об ошибке:
PS> Set-Location D: Set-Location : Cannot find path 'D:\' because it does not exist.
Выполнение команд PowerShell
Как отмечалось ранее, команды PowerShell называются командлетами. Командлеты группируются в модули PowerShell, которые можно загружать по требованию. Командлеты могут быть написаны на любом компилируемом языке .NET или на собственном языке скриптов PowerShell.
Команды PowerShell, которые активируют выполнение других команд
Оператор вызова PowerShell () позволяет выполнять команды, хранящиеся в переменных и представленные строками или блоками скриптов. С его помощью можно выполнять любые собственные команды или команды PowerShell. Такая возможность полезна в скрипте, если нужно динамически создавать параметры командной строки для собственной команды. Дополнительные сведения см. в разделе .
С помощью командлета можно выполнять собственные команды, но его следует использовать, только если нужно управлять выполнением команды. В командлете есть параметры для поддержки следующих сценариев:
- выполнение команды с использованием разных учетных данных;
- скрытие окна консоли, созданного новым процессом;
- перенаправление потоков stdin, stdout и stderr;
- использование другой рабочей папки для команды.
В следующем примере выполняется собственная команда с перенаправленными потоками ввода и вывода.
Дополнительные сведения см. в статье Start-Process.
В Windows командлет выполняет действие по умолчанию для указанного элемента. Например, он запускает исполняемый файл или открывает файл документа с использованием приложения, связанного с этим типом файла. Действие по умолчанию зависит от типа элемента и разрешается поставщиком PowerShell, который предоставляет доступ к элементу.
В следующем примере в веб-браузере по умолчанию открывается репозиторий исходного кода PowerShell.
Особенности PowerShell в Linux
1. Регистр команд в PowerShell неважен
В Windows неважен регистр команд и имён файлов и папок — это большое отличие от Linux, где регистр и команд и файлов имеет значение.
PowerShell унаследовал особенность от Windows — регистр неважен. Хотя в данном руководстве приводятся команды написанные с использованием разного регистра (например, Get-Date), на самом деле это сделано для улучшения восприятия и не имеет значения, будете ли вы вводить Get-Date, GET-DATE, get-date или gET-dATE.
2. Отсутствуют некоторые команды
Набор команд в PowerShell зависит от подключённых модулей, то есть даже на компьютере Windows если установить, например, Active Directory, то в PowerShell появятся новые команды.
В Linux версии PowerShell отсутствуют некоторые команды, которые имеются в стандартной версии PowerShell для Windows, в первую очередь, это касается специфичных для Windows вещей.
3. Много псевдонимов и сокращений
Вы можете увидеть в скриптах и примерах команд PowerShell необычное написание команд — в PowerShell допускается сокращённая запись, а также имеется много псевдонимов, то есть одно и то же действие можно выполнить командами записываемыми по-разному.
4. Версии PowerShell
Обратите внимание, что в настоящее время по умолчанию в Windows предустановлен PowerShell 5, а здесь показана установка последней версии PowerShell 7. На Windows также можно установить PowerShell 7, но это версия не заменит предустановленную — будет 2 версии PowerShell, причём при запуске через «Меню продвинутого пользователя» (Win+x) будет открываться PowerShell 5, а при запуске Windows Terminal будет открываться PowerShell 7.. 5
Пропуск названий опций
5. Пропуск названий опций
Некоторые опции являются позиционными и при указании их значений можно пропускать название опций — в первое время это может казаться запутанным.
Диски PowerShell
Так же, как Windows оперирует с данными, используя файловую систему, оболочка PowerShell работает с хранилищами данных, представленных в виде дисков. Физические диски системы являются не единственным встроенным в оболочку видом хранилищ, с которыми обеспечивается взаимодействие. Пользователь может работать с реестром, встроенными переменными и переменными среды, хранилищами сертификатов точно так же, как и с обычными дисками, папками и файлами. Реализация такого взаимодействия и обеспечение абстракций, позволяющих пользователю применять одинаковые команды и методы к различным хранилищам данных, выполняется провайдерами — программами .NET.
Список провайдеров, доступных в данный момент оболочке, можно получить командой . Изначально в PowerShell присутствуют следующие «диски» — псевдонимы (Alias), переменные среды (Env), физические диски системы (C, D, и т. д.), функции, системный реестр, внутренние переменные (Variable) и хранилище сертификатов.
Вот пример чтения содержимого ветки реестра
Как видно, использованы те же команды, что для получения сведений о файловой системе. Но структура получаемых данных, естественно, различна. Кроме названия и свойств для каждого элемента выводится номер подраздела (SKC) и номер записи (VC). С помощью PowerShell пользователь может просматривать сведения о реестре, добавлять, удалять и модифицировать ключи. Позволю привести себе что-то вроде шпаргалки по работе с элементами реестра:
И код для примера выполнения различных манипуляций с ключами реестра и их параметрами:
Вот еще небольшой пример в виде функции, которая осуществляет поиск программ, автоматически загружающихся при старте системы. Область поиска определяется массивом, включающим в себя некоторые известные точки автозапуска в реестре. Код содержит комментарии, надеюсь, они пояснят суть работы.
Пользователь может создавать собственные диски, используя существующие провайдеры. Вот пример создания диска PowerShell с именем Win, содержимое которого будет являться корневой папкой :
После создания диска PowerShell к нему можно обращаться точно так же , как к обычному диску системы.
Однако необходимо знать, что по завершении сеанса работы с PowerShell он будет автоматически удален. Так же, как и псевдонимы, функции и переменные, созданные пользователем в течение сеанса. Для того, чтобы сохранить перечисленные изменения, необходимо создать профиль PowerShell.
Копирование файлов и папок
Копирование выполняется с помощью командлета . Следующая команда создает резервную копию C:\boot.ini в C:\boot.bak:
Copy-Item -Path C:\boot.ini -Destination C:\boot.bak
Если целевой файл уже существует, то попытка копирования завершается неудачей. Чтобы перезаписать имеющийся целевой файл, используйте параметр Force.
Copy-Item -Path C:\boot.ini -Destination C:\boot.bak -Force
Эта команда работает, даже если целевой объект доступен только для чтения.
Так же выполняется и копирование папок. Эта команда копирует папку в новую папку рекурсивно.
Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe
Можно также скопировать избранные элементы. Следующая команда копирует все файлы TXT, содержащиеся в папке , в папку :
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text
Для копирования элементов файловой системы можно использовать и другие средства. В Windows PowerShell по-прежнему работают команды XCOPY, ROBOCOPY и такие COM-объекты, как Scripting.FileSystemObject. Например, можно воспользоваться COM-классом Scripting.FileSystem сервера сценариев Windows для создания резервной копии файла в файле :
(New-Object -ComObject Scripting.FileSystemObject).CopyFile('C:\boot.ini', 'C:\boot.bak')
Примеры использования Get-Alias
Пример 1: Вывести список всех псевдонимов в текущем сеансе
Get-Alias CommandType Name ----------- ---- Alias % -> ForEach-Object Alias ? -> Where-Object Alias ac -> Add-Content Alias asnp -> Add-PSSnapin Alias cat -> Get-Content Alias cd -> Set-Location Alias chdir -> Set-Location Alias clc -> Clear-Content Alias clear -> Clear-Host Alias clhy -> Clear-History ...
Эта команда получает все псевдонимы в текущем сеансе.
В выходных данных показан формат «ПСЕВДОНИМ -> ЗНАЧЕНИЕ», который был введён в Windows PowerShell 3.0. Этот формат используется только для псевдонимов, не содержащих дефисов, поскольку псевдонимы с дефисами обычно являются предпочтительными именами для командлетов и функций, а не псевдонимами.
Пример 2: Найти псевдонимы по имени
Get-Alias -Name gp*, sp* -Exclude *ps
Эта команда получает все псевдонимы, начинающиеся с gp или sp, за исключением псевдонимов, заканчивающихся на ps.
Пример 3: Узнать псевдонимы для командлета
Get-Alias -Definition Get-ChildItem
Эта команда получает псевдонимы для командлета Get-ChildItem.
По умолчанию командлет Get-Alias получает имя элемента, если известен псевдоним. Параметр -Definition получает псевдоним, если вы знаете имя элемента.
Пример 4: Получить псевдонимы по свойству
Get-Alias | Where-Object {$_.Options -Match "ReadOnly"}
Эта команда получает все псевдонимы, в которых значение свойства Options равно ReadOnly. Эта команда обеспечивает быстрый способ поиска псевдонимов, встроенных в PowerShell, поскольку у них у всех параметр ReadOnly.
Options — это лишь одно свойство объектов AliasInfo, которые получает Get-Alias. Чтобы найти все свойства и методы объектов AliasInfo, введите
Get-Alias | Get-Member
Пример 5. Поиск псевдонимов по имени и фильтрация по начальной букве
Get-Alias -Definition "*-PSSession" -Exclude e* -Scope Global
Этот пример получает псевдонимы для команд, имена которых заканчиваются на «-PSSession», за исключением тех, которые начинаются на «e».
Команда использует параметр -Scope для применения команды в глобальной области. Это полезно в сценариях, когда вы хотите получить псевдонимы в определённой сессии.
Адаптация скриптов PowerShell для Linux
Я сам только начинаю знакомство с PowerShell, но хочу привести интересный пример, как можно самостоятельно решить проблему и запустить скрипт PowerShell в Linux не смотря на то, что он выдавал ошибку.
В Invoke-TheHash есть функция Invoke-SMBEnum, которая выполняет перечисление пользователей, групп, сетевых сессий и совместных ресурсов. В Windows эта функция работает отлично. Попробую использовать её в Linux.
Запускаю консоль PowerShell:
pwsh
Перехожу в папку с уже скаченными скриптами:
cd ./bin/Invoke-TheHash/
Импортирую файл с нужной функцией:
Import-Module .\Invoke-SMBEnum.ps1
Запускаю:
Invoke-SMBEnum -Target 192.168.0.53 -Action All -Username HackWare-mial\Администратор -Hash 5187b179ba87f3ad85fea3ed718e961f -verbose
И получаю ошибку «Cannot find path ‘computername’ because it does not exist.», она означает, что не получается найти путь computername (имя компьютера), т. к. путь не существует. Ошибка возникла в этой строке:
$auth_hostname = (Get-ChildItem -path env:computername).Value
Если попытаться выполнить отдельно команду из этой строки:
Get-ChildItem -path env:computername
то она вызовет эту же самую ошибку:
Get-ChildItem: Cannot find path 'computername' because it does not exist.
Можно предположить (лучше посмотреть в справке, но мне лень туда лезть), что env имеет отношение к переменным окружения, а computername — это имя переменной, которая содержит (как следует из названия) имя компьютера. Судя по всему, в Linux эта переменная окружения не существует.
Самое простое решение — прописать это имя вручную. Для этого открываю файл Invoke-SMBEnum.ps1 текстовым редактором, нахожу там строку
$auth_hostname = (Get-ChildItem -path env:computername).Value
И меняю её на такую строку:
$auth_hostname = 'hackware-mial'
То есть я просто прописал имя компьютера вместо получения его с помощью функции.
Важно помнить, что после импорта функция будет считываться не из файла, который я изменил, а из памяти. Поэтому чтобы PowerShell увидел сохранённые в файле изменения, нужно заново выполнить импорт файла — для этого пришлось закрыть (CTRL+d) и открыть заново PowerShell:
pwsh
Импортируем файл:
cd ./bin/Invoke-TheHash/ Import-Module .\Invoke-SMBEnum.ps1
И после этого вновь запускаю команду:
Invoke-SMBEnum -Target 192.168.0.53 -Action All -Username HackWare-mial\Администратор -Hash 5187b179ba87f3ad85fea3ed718e961f -verbose
В этот раз команда сработала.
Мораль:
- после внесения изменений в файл нужно заново его импортировать (возможно, даже перезайти в PowerShell)
- некоторые проблемы с запуском скриптов PowerShell в Linux достаточно просто решить самостоятельно
Полезные командлеты Windows PowerShell
В данном разделе я перечислю командлеты PowerShell, которые Вы точно будете использовать.
- Get-Help – показывает справку по командлету, функции и общую справку по Windows PowerShell. Справка бывает нескольких типов: краткая, детальная, полная и вывод только примеров;
- Update-Help — загружает и устанавливает новые файлы справки, т.е. обновление справки;
- Get-Command – командлет поиска нужной команды, можно искать как по глаголу, так и по существительному, также возможно использование маски, если Вы не знаете точное наименование глагола или существительного;
- Get-Alias – показывает псевдонимы, все или конкретной команды;
- Get-PSDrive – показывает подключенные диски;
- Get-Member – выводит свойства и методы, которые есть у объекта;
- Get-WindowsFeature – выводит сведения о доступных ролях и компонентах сервера;
- Install-WindowsFeature (эквивалентен Add-WindowsFeature) — устанавливает роли или компоненты на указанный сервер;
- Uninstall-WindowsFeature (эквивалентен Remove-WindowsFeature) – удаляет роли или компонента сервера;
- Get-History — возвращает список команд, введенных в ходе текущей сессии.
PowerShell как командная оболочка
Для эффективной и удобной работы в командной строке важны два момента.
- Нужно знать названия команд и их ключей. Запомнить их будет проще, если синтаксис команд интуитивно понятен и однороден. Если мы не помним ключи у команды, то должна быть возможность быстро найти справку по этой команде и примеры ее использования.
- Сами команды и их ключи должны быть краткими и удобными для быстрого набора на клавиатуре. Оболочка должна поддерживать механизмы автодополнения, поиска и повтора выполнявшихся ранее команд.
Если со вторым пунктом у стандартных оболочек Linux все хорошо, то похвалиться понятностью имен и ключей команд они не могут: названия многих утилит представляют собой аббревиатуры, придуманные еще в 1960-е годы, а одни и те же ключи в разных командах могут иметь разный смысл. В PowerShell такой проблемы нет.
Структура команд и псевдонимы
В PowerShell имена всех внутренних команд соответствуют шаблону «действие‑объект», например (получить информацию о процессе), (получить содержимое файла), (очистить экран). Для одинаковых параметров команд используются стандартные имена, структура параметров во всех командах идентична, все команды обрабатываются одним синтаксическим анализатором. Это делает семантику команд очевидной и значительно упрощает запоминание и использование команд PowerShell.
С другой стороны, иногда PowerShell ругают именно за этот многословный и необычный для других оболочек синтаксис. Например, нам нужно создать в текущем каталоге пустой файл . В Bash это делается командой из пяти букв:
При создании файла в PowerShell с помощью команды с параметрами потребуется ввести больше двадцати символов.
Создание файла 1.txt c помощью команды New-Item
Выглядит ужасно, правда? Но того же результата можно добиться, набрав команду всего из двух символов.
Создание файла 2.txt c помощью команды ni
Команда — это стандартный псевдоним для (сокращение по первым буквам слов команды), значение для параметра используется по умолчанию, имя параметра можно опустить.
Таким образом, стандартные псевдонимы PowerShell, полный список которых можно получить с помощью команды , помогают быстро вводить команды и создавать компактные и лаконичные конвейеры из нескольких команд.
Получение полного списка псевдонимов c помощью команды Get-Alias
Отметим, что в Windows PowerShell за некоторыми командлетами закреплены псевдонимы, соответствующие стандартным командам Unix-подобных систем: , , , , , , , . В PowerShell 6/7 данные псевдонимы не определены, их ввод приведет к выполнению «родных» команд Linux.
Доступность команд
В .NET Core/.NET 5 реализована не вся функциональность платформы .NET Framework, поэтому в PowerShell 6/7 по умолчанию загружается меньше модулей и будет доступно меньше команд, чем в Windows PowerShell. Например, под Linux недоступны команды .
Часть из отсутствующих модулей напрямую связаны с особенностями операционной системы Windows и не могут быть перенесены на другие платформы (так, в PowerShell для Linux отсутствуют провайдеры и виртуальные диски для системного реестра и хранилища сертификатов), некоторые модули могут быть добавлены в следующих версиях PowerShell.
При работе с PowerShell в Linux необходимо учитывать особенности операционной системы.
Работа с объектами
Так как PowerShell работает с объектами, он позволяет выполнять некие действия над этими объектами, например:
- Measure-Object – командлет позволяет рассчитывать на основе свойств объектов такие числовые агрегирующие параметры как: минимальное, максимальное, среднее значение, сумму и количество. Например, Вы хотите узнать максимальный или средний размер файла в определенном каталоге, или просто узнать количество файлов (запущенных процессов, служб и так далее);
- Select-Object – с помощью данного командлета можно выбрать определенные объекты или свойства этих объектов, например Вы хотите выводить только название файла и его размер;
- Sort-Object — сортирует объекты по значениям свойств;
- Where-Object – командлет для того чтобы ставить условие для выборки объектов на основе значений их свойств;
- Group-Object – группирует объекты, которые содержат одинаковое значение для заданных свойств;
- ForEach-Object – перебор объектов с целью выполнения определенной операции над каждым из этих объектов.
Копирование и перемещение папок и файлов
В следующем примере, с помощью Powershell, будет скопирован файл ‘C:\data.txt’ в директорию ‘C:\Catalog\’:
Перемещение объектов выполняется так же, но с использованием Move-Item:
Если в перемещаемой папке уже существует файл с этим именем, то мы получим ошибку:
Move-Item : Cannot create a file when that file already exists
Для исправления этой ситуации можно использовать параметр Force или перемещать файл под другим именем. Новое имя можно указать в Destination:
Каталоги переносятся и копируются так же. Знак ‘\’ в конце Destination говорит, что мы хотим перенести папку внутрь указанной. Отсутствие знака ‘\’ говорит, что это новое имя директории:
Path — принимает список, а это значит, что мы можем указывать несколько значений через запятую.
Использование масок для копирования и перемещения
Во многих командах Powershell доступны следующие специальные символы:
- * — говорит, что в этом месте есть неизвестное количество неизвестных символов;
- ? — в этом месте есть один неизвестный символ;
- — в этом месте есть одна из следующих букв A,B,C.
Например так мы скопируем все объекты с расширением ‘txt’ из одной папки в другую:
Перемещение сработает так же.
Предыдущий вариант сработает, если мы ищем файлы в текущей директории. Для копирования в Powershell внутри всех вложенных каталогов нужно использовать рекурсивный поиск, который доступен только в Copy-Item. Рекурсивный поиск устанавливается ключом Recurse. В следующем примере будет найден и скопирован файл hosts. В качестве * я указал один из элементов неизвестного пути:
Дополнительные параметры фильтрации
Если предыдущих примеров, где мы находили файлы с неизвестным название, не достаточно, то можно использовать дополнительные параметры. Они доступны в обеих командах Copy-Item и Move-Item:
- Include — включает объекты с этим упоминанием;
- Exclude — работает аналогично предыдущему, но исключает объекты;
- Filter — включает объекты указанные в этом параметре.
Я не вижу смысла использовать все параметры описанные выше в одной команде, но в них есть отличия. Filter будет работать быстрее, так как он работает и фильтрует данные в момент их получения. Include и Exclude сработают после получения всех файлов, но каждое значение для них можно указывать через запятую
Для Include и Exclude так же важно указывать Path с ‘*’ в конце, например ‘C:\dir\*’
Например мы хотим скопировать все объекты с расширением ‘txt’ и ‘jpg’. Это можно сделать так:
Я бы не рекомендовал использовать Filter в обеих командах. Более удобный способ — это искать файлы с Get-ChildItem, а затем их копировать и перемещать в нужное место. В следующем примере будут перенесены все объекты формата ‘.txt’ и ‘.jpg’ в каталог Directory:
Вам так же будет интересно:
Другие функции скрипта
PowerShell имеет множество полезных функций, которые можно использовать в сценариях.
-
— Инструкцию можно использовать, чтобы предотвратить выполнение скрипта без указанных модулей или оснастки и указанной версии PowerShell. Дополнительные сведения см. в разделе about_Requires.
-
— содержит полный путь и имя выполняемого скрипта. Этот параметр действителен во всех скриптах. Эта автоматическая переменная представлена в PowerShell 3.0.
-
— содержит каталог, из которого выполняется скрипт. В PowerShell 2.0 эта переменная действительна только в модулях скриптов ().
Начиная с PowerShell 3.0, он действителен во всех сценариях. -
— Автоматическая переменная содержит сведения о текущем скрипте, включая сведения о том, как он был запущен или «вызван». Эту переменную и ее свойства можно использовать для получения сведений о скрипте во время его выполнения. Например, . Переменная MyCommand.Path содержит путь и имя файла скрипта. . Строка содержит команду, которая запустила скрипт, включая все параметры и значения.
Начиная с PowerShell 3.0, имеет два новых свойства, которые предоставляют сведения о скрипте, который вызвал или вызвал текущий скрипт. Значения этих свойств заполняются только в том случае, если вызывающий объект или вызывающий объект является скриптом.
-
PSCommandPath содержит полный путь и имя скрипта, который вызвал или вызвал текущий скрипт.
-
PSScriptRoot содержит каталог скрипта, который вызвал или вызвал текущий скрипт.
В отличие от переменных и автоматических переменных, содержащих сведения о текущем скрипте, свойства PSCommandPath и PSScriptRoot переменной содержат сведения о скрипте, который называется текущим скриптом.
-
-
Разделы данных. Ключевое слово можно использовать для разделения данных из логики в скриптах. Разделы данных также упрощают локализацию. Дополнительные сведения см. в about_Data_Sections и about_Script_Internationalization.
-
Подписывание скрипта — вы можете добавить цифровую подпись в скрипт. В зависимости от политики выполнения можно использовать цифровые подписи для ограничения выполнения сценариев, которые могут включать небезопасные команды. Дополнительные сведения см. в разделе about_Execution_Policies и about_Signing.
Несколько полезных трюков
Разобравшись с редактором, можно приступать к написанию кода. PowerShell — несложный язык, и, я думаю, ты быстро разберешься, что к чему. Команды здесь называются командлетами, и каждый из них состоит из двух частей. Сначала идет действие, например Get, Set, Add, Invoke, Remove. Затем указывается то, на что действие направлено: Service, VM, AzureAccount, DHCPServerSetting. Каждая часть отделяется от другой дефисом. Получается, к примеру, get-process. Это, кстати, полезная команда, которая выводит список процессов. Скажем, если написать
увидим что-то такое:
INFO
Если при наборе команды нажать Tab, то редактор дополнит команду — так же, как в консоли. Двойное нажатие на Tab выведет список подходящих команд.
Теперь можно завершить зависший процесс:
Хочешь посмотреть права на директорию? Сделать это помогает такой командлет:
Можно просмотреть рекурсивно, правда уже чуть с более сложной логикой:
Если не можешь понять, что делает какой-то командлет, напиши следующее (заменив Get-Process на название неизвестного командлета):
Можно также выполнить
В этом случае будет выведен весь список возможных вариантов.
Теперь давай попробуем узнать что-нибудь о нашем домене через консоль PowerShell. К примеру, давай посмотрим пользовательские аккаунты, у которых установлен неистекающий пароль:
Кстати, к каждому полю в окошке опции учетной записи или компьютера можно обратиться и считать данные. Таким образом можно делать целые срезы. Вот, к примеру, запрос на основе данных о телефонных номерах:
PowerShell в сравнении с bat
Иногда задачу можно решить как старым дедовским методом, так и при помощи PowerShell. Я рекомендую не лениться и использовать PS, хотя бы просто потому, что так ты его быстрее изучишь и сможешь применять в более сложных ситуациях. К тому же ты постепенно оценишь его синтаксис — более элегантный и консистентный. Вот несколько примеров, как вещи делались раньше и как их можно сделать при помощи PowerShell.
Следующая командная строка перезагрузит компьютер с задержкой в десять секунд:
На PowerShell это будет выглядеть вот так:
Вот так через bat можно перезагрузить службу dnscache (или любую другую):
В PowerShell это будет так:
Мап диска в bat:
И в PowerShell:
Да, иногда приходится печатать чуть больше букв, но читаются команды PS гораздо лучше. И это не говоря уже про разные новые возможности.
Удаленное управление с PowerShell
В основном описанные в статье команды выполняются на том же компьютере, на котором они запущены. Проще говоря, команды для управления AD выполнять нужно на сервере, где контроллер домена и установлен, что, согласись, на корню рубит удобство и автоматизацию. Для выполнения команд удаленно, что нам и требуется, надо пользоваться специальными командлетами. К примеру, для подключения к удаленному компьютеру и перезапуску там спулера печати вводи
Более подробно читай тут.
Что почитать еще
Книжек и прочих обучающих материалов по PowerShell огромное количество. Есть как справочники, так и учебные туториалы. Начать можно с , где есть неплохие видеоуроки.
В деле немало поможет и книга «Master-PowerShell» Тобиаса Велтнера. В ней автор охватывает многие понятия вроде массивов, хеш-таблиц, конвейеров, объектов, функций, обработки ошибок, регулярных выражений и так далее. Заодно подробно рассматривается XML и разные аспекты администрирования. Увы, на русский эта книга не переведена.
Из русскоязычных мануалов по PowerShell мне попадался «Windows PowerShell 2.0. Справочник администратора» Уильяма Станека — он весьма неплох.
На «Хабрахабре» есть перевод полезной статьи Джеффери Хикса об администрировании Active Directory при помощи PowerShell.