Восстановление и приостановка работ служб
Не каждую службу можно приостановить (Pause) и восстанавливть. Что бы увидеть все службы, у которых есть такая возможность, выполните:
Командой ниже мы получи, нажмем паузу и восстановим работу сервиса Winmgmt:
Ошибки, если мы попытаемся остановить службу у которых нет такой возможности:
- Service ‘Windows Remote Management (WS-Management)’ cannot be suspended because the service does not support beingsuspended or resumed.
- Не удается приостановить службу «Spooler», так как этой службой не поддерживается приостановка или возобновление.
В этих командах так же можно использовать параметры Include и Exclude, с масками.
На скрипте ниже показана проверка возможности приостановки сервиса, если у него есть такая возможность. Если ее нет, то сервис остановит свою работу:
Выполнить команду на удалённом компьютере через PsExec.exe
Один из моих любимых способов для решения этой задачи это утилита командной строки PsExec.exe написанная Марком Руссиновичем, которую вы можете свободно скачать с сайта Windows SysInternals. Ссылку на неё вы можете найти в конце статьи. Она не требует установки в систему, вы можете просто скопировать её в одну из папок, содержащихся в переменной окружения %path% и вызывать из любой оболочки командной строки: Cmd или PowerShell.
Использовать PsExec очень просто. Например, чтобы выполнить ipconfig /flushdns на компьютере main, достаточно запустить следующую команду:
Команда ipconfig будет запущена на компьютере main под вашими учетными данными. После завершения работы ipconfig весь текстовый вывод будет передан на ваш компьютер, а кроме того будет возвращён код выхода команды (error code). В случае если команда выполнилась успешно, он будет равен 0.
Выполнить команду на удалённом компьютере
Разумеется, на этом возможности PsExec не заканчиваются. Вызвав утилиту без параметров, можно посмотреть другие доступные опции
Я обращу внимание лишь на некоторые из них
Ключ -d говорит PsExec что ненужно дожидаться выполнения команды, а достаточно лишь запустить её, и забыть. В этом случае мы не получим выходных данных от консольной утилиты, но зато сможем не дожидаясь завершения предыдущей команды запускать другие. Это очень полезно, если вам необходимо запустить, например установщик программы на нескольких компьютерах.
По умолчанию PsExec выполняет команды в скрытом режиме, то есть на системе где выполняется команда, не будут выводиться никакие окна или диалоги. Однако есть возможность изменить это поведение, с помощью ключа -i . После него можно указать номер сессии, в которой выводить окна, а можно и не указывать, тогда интерфейс будет отображен в консольной сессии.
Таким образом, чтобы вывести окно с информацией о версии операционной системы на компьютере main, следует запустить PsExec таким образом:
Если вы хотите выполнить команду сразу на нескольких компьютерах, вам пригодится возможность прочитать их имена из текстового файла списка.
Ну и одной из самых полезных способностей PsExec является возможность интерактивного перенаправления ввода/вывода между компьютерами, что позволяет нам запустить, например cmd.exe на удалённом сервере, а давать ему команды и получать результаты на локальном компьютере.
Выполнить команду на удалённом компьютере
Каким образом работает PsExec?
Следующий способ реализации этой популярной задачи, о котором я хочу поведать – использование Windows Management Instrumentation. WMI присутствует во всех операционных системах Microsoft, начиная с Windows 2000, и даже на Windows 9x его можно установить из отдельного пакета. WMI включён по умолчанию, и не требует дополнительной настройки. Для его использования достаточно административных прав, и разрешенного на брандмауэре протокола DCOM. WMI предоставляет огромные возможности для управления системами, но нас сейчас интересует лишь одна из них.
Для запуска процессов нам потребуется метод Create класса Win32_Process. Использовать его достаточно несложно. В PowerShell это делается следующим образом:
Здесь в качестве запускаемого процесса я указал cmd.exe, а уже ему, в качестве аргументов передал нужную команду. Это необходимо в случае если вам нужно использовать переменные окружения удалённого компьютера или встроенные операторы cmd.exe, такие как «>» для перенаправления вывода в файл. Метод Create не дожидается завершения процесса, и не возвращает результатов, но зато сообщает нам его идентификатор – ProcessID.
Если вы используете компьютер, на котором пока не установлен PowerShell, вы можете вызвать этот метод WMI и из сценария на VBScript. Например вот так:
Метаданные экземпляра
Вы можете запрашивать метаданные экземпляра Azure из вашего azure VM для просмотра таких сведений, как osType, Location, vmSize, vmId, name, resourceGroupName, subscriptionId, privateIpAddress и publicIpAddress.
Для запроса метаданных экземпляров требуется подключение к сети для здоровой гостевой сети, так как она делает вызов REST через хост Azure в службу метаданных экземпляра. Таким образом, если вы можете запрашивать метаданные экземпляра, это говорит о том, что гость может общаться по сети со службой, принимающей Azure.
Дополнительные сведения см. в службе метаданных Azure Instance.
Поддержка приложений
Утилиты и сервера
Приложение | Версия | cmdlets | Провайдер | Управление GUI |
---|---|---|---|---|
Exchange Server | 2007 | 402 | Да | Да |
Windows Server | 2008 | Да | Да | Нет |
Microsoft SQL Server | 2008 | Да | Да | Нет |
Microsoft SharePoint | 2010 | Да | Да | Нет |
System Center Configuration Manager | 2012 R2 | 400+ | Да | Нет |
System Center Operations Manager | 2007 | 74 | Да | Нет |
System Center Virtual Machine Manager | 2007 | Да | Да | Да |
System Center Data Protection Manager | 2007 | Да | Нет | Нет |
Windows Compute Cluster Server | 2007 | Да | Да | Нет |
Microsoft Transporter Suite for Lotus Domino | 08.02.0012 | 47 | Нет | Нет |
Microsoft PowerTools for Open XML | 1.0 | 33 | Нет | Нет |
IBM WebSphere MQ | 6.0.2.2 | 44 | Нет | Нет |
Quest Management Shell for Active Directory | 1.6 | 95 | Нет | Нет |
Special Operations Software Specops Command | 1.0 | Да | Нет | Да |
VMware vSphere PowerCLI | 6.3 R1 | 455 | Да | Да |
Internet Information Services | 7.0 | 54 | Да | Нет |
Windows 7 Troubleshooting Center | 6.1 | Да | Нет | Да |
Microsoft Deployment Toolkit | 2010 | Да | Да | Да |
NetApp PowerShell Toolkit | 4.2 | 2000+ | Да | Да |
JAMS Scheduler – Job Access & Management System | 5.0 | 52 | Да | Да |
UIAutomation | 0.8 | 432 | Нет | Нет |
Dell Equallogic | 3.5 | 55 | Нет | Нет |
LOGINventory | 5.8 | Да | Да | Да |
SePSX | 0.4.1 | 39 | Нет | Нет |
Планировщик заданий (Task Scheduler)
Планировщиком заданий можно управлять из командной строки используя две утилиты – at.exe и schtasks.exe. Обе эти утилиты позволяют указать имя удалённого компьютера для создания задания, и, следовательно, позволяют решить нашу задачу. Но подробно мы рассмотрим лишь schtasks.exe, так как она предоставляет гораздо больше возможностей.
Хотя выполнение команд на других компьютерах не является основным предназначением планировщика, тем не менее он позволяет реализовать немало интересных сценариев. Например, с его помощью можно включить установку программного обеспечения в период обеденного перерыва. Или если ваши пользователи обедают в разное время, запуск можно выполнять после определённого периода бездействия компьютера.
schtasks /create /s server6.td.local /tn install /tr \\main\data\install.cmd /sc once /st 13:00 /ru system
Важно понимать от имени какой учетной записи будет выполняться задача. В этом примере я указал для параметра /ru значение system, следовательно, для выполнения установки учетной записи компьютера будет необходим доступ на чтение в сетевую папку с дистрибутивом программы
Еще полезным решением, мне кажется запланировать какое либо действие, на ежедневное выполнение, и удалять задачу лишь при подтверждении его успеха. То есть вы можете создать простой командный файл, который сначала запускает установщик программы, дожидается его завершения, и проверяет – успешно ли установилась программа. Если это так, то он удаляет задание из планировщика на этом компьютере. Пример такого файла:
Get-ADComputer — синтаксис использования командлета
Чтобы получать информацию из AD с помощью командлетов из модуля AD для PowerShell, вам не нужны права администратора домена. Достаточно, чтобы учётная запись, под которой запускается командлет, была членом группы «Domain Users / Authenticated Users».
Чтобы получить информацию о конкретной учётной записи компьютера в домене, укажите её имя в качестве аргумента параметра -Identity:
Get-ADComputer -Identity hackware-server
Пример вывода:
DistinguishedName : CN=HACKWARE-SERVER,OU=Domain Controllers,DC=ds,DC=hackware,DC=ru DNSHostName : HackWare-Server-2022.ds.hackware.ru Enabled : True Name : HACKWARE-SERVER ObjectClass : computer ObjectGUID : 77e65141-ebec-4728-a1cc-563199d86bf8 SamAccountName : HACKWARE-SERVER$ SID : S-1-5-21-670420343-3848213752-1643348011-1000
Get-ADComputer -Identity hackware-server -Properties *
Используя Get-Member, вы можете получить список всех свойств объекта ADComputer:
Get-ADComputer -Filter * -Properties * | Get-Member
Дата последнего входа компьютеров в сеть указана в атрибуте LastLogonDate.
Командлет Get-ADComputer позволяет отображать любые свойства компьютера в результатах выполнения команды. Удалите всю ненужную информацию, оставив только значения атрибутов Name и LastLogonDate.
Get-ADComputer -identity hackware-win -Properties * | Format-Table Name,LastLogonDate -Autosize
Итак, мы получили данные о последней регистрации в домене для отдельного компьютера. Затем вам нужно изменить команду, чтобы она отображала информацию о времени последней сетевой регистрации для всех компьютеров в домене. Для этого замените -Identity на -Filter *:
Get-ADComputer -Filter * -Properties * | Format-Table Name,LastLogonDate -Autosize
У нас получилась простая таблица, которая содержит всего 2 поля: имя компьютера и дата LastLogonData. Вы можете добавить в эту таблицу другие поля объекта ADComputer.
Чтобы отобразить информацию об объектах компьютеров в определённом OU (организационном подразделении), используйте параметр -SearchBase:
Get-ADComputer -SearchBase 'OU=Paris,DC=woshub,DC=loc' -Filter * -Properties * | Format-Table Name,LastLogonDate -Autosize
Отсортируйте результаты запроса по дате последнего входа в систему с помощью командлета Sort-Object:
Get-ADComputer -Filter * -Properties * | Sort-Object LastLogonDate | Format-Table Name,LastLogonDate -Autosize
Итак, у нас есть список компьютеров и дата их последнего входа в домен Active Directory. Теперь мы хотим отключить учётные записи компьютеров, которые не использовались в течение 120 или более дней.
Используя Get-Date, мы можем получить значение текущей даты в переменной и уменьшить его до 120 дней:
$date_with_offset = (Get-Date).AddDays(-120)
Полученную переменную даты можно использовать как фильтр запроса Get-ADComputer в поле LastLogonDate:
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonDate -lt $date_with_offset } | Sort-Object LastLogonDate | Format-Table Name,LastLogonDate -Autosize
Итак, мы создали список неактивных учётных записей компьютеров, которые не регистрировались в сети более 120 дней. Используйте команду Disable-ADAccount или Set-ADComputer, чтобы отключить их.
Совет. В первый раз лучше проверить результаты выполнения команды с помощью переключателя -WhatIf, который позволяет увидеть, что произойдёт, если бы команда была запущена, но при этом в системе ничего изменено не будет.
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonData -lt $date_with_offset } | Set-ADComputer -Enabled $false -WhatIf
Теперь вы можете отключить все неактивные учётные записи компьютеров:
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonData -lt $date_with_offset } | Set-ADComputer -Enabled $false
Примечание. Также вы можете получить список заблокированных, отключённых и неактивных компьютеров и пользователей домена с помощью отдельного командлета Search-ADAccount.
Системные $_ и $PSItem и конвейер
Когда мы работаем с существующими командами Powershell бывает необходимо передать определенное значение в параметр. На примере ниже у нас есть список сервисов статус которых мы хотим получить:
На самом деле команда сама подставляет нужные переменные под нужные параметры, которые в целом выглядят так:
Если вы читали статью про функции Powershell, то знаете, что существуют параметры принимающие значения из конвейера и которые этого делать не могут. Что бы увидеть какие параметры принимают данные из конвейера используйте Get-Help:
При создании командлетов указывается какие параметры будут принимать значения из конвейера, какие только по имени (свойству) и каким достаточно только значения. Если нам нужно подставить наши значения в определенный параметр в конвейере используется специальная переменная «$PSItem» или «$_» . Они так же используются в выражениях (ScriptBlock). Например выполнив следующую команду мы получим ошибку:
- Get-Service : Не удается найти службу с именем службы.
- Get-Service : Cannot find any service with service name.
Этот тип массивов относится к именованным, а это значит что-либо должно совпадать имя/свойство (оно Service вместо Name) либо мы должны передаваться только значение. Первый вариант это корректно переименовать хэш-таблицу:
Пример выше сработает если только именованный массив относится к PSCustomObject. Если бы это был hashtable, то была бы ошибка.
Второй вариант это напрямую передавать значение:
Чаще и удобнее всего значения подставлять так:
Еще один пример использования $PSItem и $_ в выражениях (ScriptBlock). Вам наверняка часто требуется изменить вывод команд. На примере ниже я получаю сервис, который запущен и содержит в имени «WinR»:
Where-Object — самый частый пример использования таких переменных, так как по умолчанию он не позволяет использовать несколько условий.
Импорт и экспорт
PowerShell позволяет импортировать и экспортировать данные в разных распространенных форматах, например, CSV или XML, а также перенаправлять вывод результата работы команды во внешний файл или на принтер.
- Export-Csv – экспорт данных в формат CSV;
- Import-Csv – импортирует данные из CSV файла;
- Export-Clixml — экспорт данных в формат XML;
- Import-Clixml — импортирует файл CLIXML и создает соответствующие объекты в оболочке Windows PowerShell;
- Out-File — посылает вывод результата работы командлета во внешний файл (например, в TXT);
- Out-Printer — вывод результата работы команды на принтер;
- Import-Module — добавляет модули в текущей сессии.
Проксирование
Этот метод отличается от всех вышеперечисленных, и служит совсем для других задач, но не менее актуален. Когда делегирование полномочий невозможно, или предоставляет слишком большие возможности, он позволяет разрешить обычному пользователю выполнять некую команду. Требующую административных привилегий, никаким образом не выдавая дополнительных полномочий и не подставляя под угрозу пароль администратора.
Чаще всего такие проблемы люди решают с помощью утилит вроде cpau.exe. Они создают файл с зашифрованным паролем административной учетной записи, позволяющий запускать определённую программу. Проблема, однако, в том, что хоть пароль и зашифрован, перед запуском программы утилите придётся его расшифровать. А соответственно пользователь может использовать утилиту повторяющую алгоритм расшифровки пароля, и узнать его, чтобы затем использовать для запуска других программ или получения дополнительных привилегий. Практически это конечно достаточно сложно для обычных пользователей, не обладающих специальными знаниями, но, тем не менее, вполне возможно. Еще раз уточню, это не беда конкретной утилиты, а проблема такого подхода вообще.
Еще может показаться, что для решения задачи подойдет параметр /savecred утилиты runas. Но тут есть даже две проблемы. Во-первых, как и вышеописанном случае, пароль сохраняется на компьютере пользователя, а, следовательно, может быть расшифрован, хотя в случае с runas для этого и понадобятся права локального администратора. Во-вторых, runas сохраняет учетные данные, не связывая их с конкретной командой, а, следовательно, пользователь сможет запустить с завышенными правами не только ту команду, доступ к которой вы хотели ему предоставить, но и любую другую.
Чтобы избежать этих проблем, но, тем не менее, разрешить выполнение конкретной команды, можно использовать методику, которая называется «проксированием».
Работает она следующим образом. На компьютере постоянно работает сценарий с высокими привилегиями. Например, в нашем случае он будет запущен из-под учетной записи, обладающей правами администратора на файловом сервере. По сигналу пользователя он будет выполнять одну, заранее определённую команду. В этом примере – закрывать все файлы, открытые по сети.
Для организации этой системы мы поместим на сервере, например в папке c:\scripts\ командные файлы Server.cmd и Action.cmd .
Листинг №5 – Action.cmd (Windows Batch)
Server.cmd будет ждать знака от пользователя, и получив его, запускать файл с командами – Action.cmd. Разумеется, в эту папку пользователи не должны иметь никакого доступа. Автоматический запуск Server.cmd при запуске компьютера можно организовать, просто создав соответствующую задачу в планировщике:
После параметра /ru указывается учетная запись, под которой будет выполняться сценарий (в нашем случае она обладает правами администратора на сервере), так как после параметра /rp пароль не указан – он будет запрошен при создании задачи. Параметр /sc позволяет указать момент запуска сценария, в нашем случае – при включении компьютера. Ну а /tn и /tr позволяют указать имя задачи, и исполняемый файл.
Теперь, для того чтобы пользователь мог подать сценарию сигнал, мы создадим папку c:\commandShare и сделаем её доступной по сети. Доступ на запись в эту папку должен быть только у тех пользователей, которые будут запускать команду.
После этого достаточно будет поместить пользователю на рабочий стол файл Run.cmd.
Листинг №6 – Run.cmd (Windows Batch)
При его выполнении, от имени пользователя, будет создаваться файл \\server\commandShare\trigger.txt. Сценарий Server.cmd, заметив его, запустит на выполнение со своими привилегиями файл Action.cmd. Он добавит запись в файл c:\scripts\log.txt о текущем времени, а затем удалит trigger.txt .Чтобы не выполнять команду снова до следующего сигнала пользователя.
В сценарии Server.cmd используется утилита Sleep.exe, позволяющая сделать паузу в выполнении сценария на заданный в секундах промежуток времени. Она не входит в состав операционной системы, но её можно взять из набора Resource Kit Tools (см. ссылки) и просто скопировать на любой компьютер.
cmdlets
cmdlets — это специализированные команды PowerShell, которые реализуют различную функциональность. Это встроенные в PowerShell команды. cmdlets именуются по правилу , например, , благодаря чему их предназначение понятно из названия. cmdlets выводят результаты в виде объектов или их коллекций. Дополнительно cmdlets могут получать входные данные в такой же форме и, соответственно, использоваться как получатели в конвейере. Хотя PowerShell позволяет передавать по конвейеру массивы и другие коллекции, cmdlets всегда обрабатывают объекты поочередно. Для коллекции объектов обработчик cmdlet вызывается для каждого объекта в коллекции по очереди.
Экземпляры объектов создаются в PowerShell и запускаются им при вызове. cmdlets наследуются от или от , причём последний используется тогда, когда cmdlet необходимо взаимодействовать с исполняемой частью PowerShell. В этих базовых классах оговорены некоторые методы — , и , как минимум один из которых реализация cmdlets должна перезаписать для предоставления своей функциональности. Каждый раз при запуске cmdlet эти методы вызываются PowerShell по очереди. Сначала вызывается , затем, если cmdlet передаются данные по конвейеру, для каждого элемента, и в самом конце — . Класс, реализующий , должен иметь один атрибут .NET — , в котором указываются глагол и существительное, составляющие имя cmdlet. Популярные глаголы представлены в виде перечисления.
Реализации cmdlets могут вызывать любые доступные .NET API и могут быть написаны на любом языке .NET. PowerShell также предоставляет некоторые дополнительные API, такие, как , которые необходимы для доступа к специфичной для PowerShell функциональности, например, для вывода результирующих объектов в конвейер. cmdlets могут использовать API для доступа к данным напрямую или воспользоваться инфраструктурой поставщиков PowerShell, которые позволяют обращаться к хранилищам данных через уникальные пути. Хранилища данных представляются через буквы дисков и иерархическую структуру внутри них (|директории). Windows PowerShell поставляется с поставщиками для файловой системы, реестра Windows, хранилища сертификатов, а также для псевдонимов команд, переменных и функций. Другие приложения могут добавлять свои cmdlets и поставщики для доступа к своим хранилищам данных.
В PowerShell 2.0 была добавлена возможность создания cmdlets на самом PowerShell, без использования .NET-языков.
Другие командлеты Windows PowerShell
Также хотелось бы выделить следующие командлеты Windows PowerShell, которые наверняка Вам понадобятся и будут полезны.
- Get-ExecutionPolicy – с помощью данного командлета можно узнать действующую политику выполнения Windows PowerShell для текущего сеанса;
- Set-ExecutionPolicy – командлет изменяет политику выполнения Windows PowerShell;
- Write-Host – выводит информацию на экран (пишет текст);
- Read-Host – считывает строку ввода из консоли;
- Write-Warning – выводит предупреждающее сообщение;
- Write-Error – командлет объявляет ошибку и выводит ее в поток ошибок;
- Get-Date – возвращает текущую дату и время;
- Set-Date – командлет изменяет системную дату и время на компьютере.
Вот мы с Вами и рассмотрели полезные и часто используемые командлеты Windows PowerShell, надеюсь, этот справочник будет Вам полезен, удачи!
Нравится29Не нравится3
2 ответа
Лучший ответ
Те команды, которые встроены в (например, , ), являются не напрямую вызывается в сеансе PowerShell, но вы можете вызвать их через ; например.:
Однако вы обнаружите, что большинство таких команд имеют более мощные аналоги PowerShell. Чтобы упростить переход, некоторые команды PowerShell (называемые командлетами ) имеют псевдонимы , названные для их предшественников (например, имеет псевдоним ` X2`; используйте , чтобы узнать, к какой команде относится данное имя).
Обратите внимание, что PowerShell также предоставляет превосходные замены для внешних утилит ; Например, PowerShell является превосходной альтернативой. В отличие от встроенных команд , вы можете вызывать такие внешние утилиты напрямую из PowerShell
Вы можете запустить , чтобы определить, относится ли данное имя команды к встроенной команде или внешней утилите : если это последняя, печатается полный путь к ней . (Этот метод работает как с , так и с , но в PowerShell вы должны включить расширение , потому что просто означает что-то другое: это псевдоним { {X6}} командлет.)
Во всех этих случаях важно понимать, что синтаксис PowerShell работает совсем по-другому и что передаваемые аргументы будут интерпретироваться PowerShell first :
-
обеспечивает общий обзор .
-
Примечательно, что PowerShell имеет гораздо больше метасимволов, чем (больше символов имеют особое синтаксическое значение).
-
Особый интерес при вызове или вызове внешней утилиты представляет собой символ PSv3 + stop-parsing , , который обрабатывает оставшуюся часть команды так, как если бы она имела был вызван из ; например .:
8
mklement0
19 Апр 2018 в 11:43
Да вроде.
Иногда Powershell использует другой синтаксис для команд, поэтому, если у вас есть определенные команды, которые вы часто используете в CMD, вы можете сначала выполнить их быстрый поиск. Большинство команд одинаковы. Имейте в виду, что кучу команд powershell нельзя запустить без окна, имеющего права администратора, и окно PS не гарантирует, что оно имеет эти привилегии.
Новое обновление для Windows 10 избавило от обычных окон CMD в пользу PS. Это означает, что он светится электрическим синим цветом, но вы всегда можете изменить это, используя параметры по умолчанию или Свойства. Я считаю, что это изменение в Win10 также означало, что они устанавливают псевдонимы для CMD в PS для нас, но не указывайте меня на этом.
Kinna T
17 Май 2017 в 19:14
Отображение содержимого файла
Самое основное и распространенное использование команды cat — это чтение содержимого файлов.
Например, следующая команда отобразит содержимое файла в терминале:
Перенаправить содержимое файла
Вместо отображения вывода на стандартный вывод (на экране) вы можете перенаправить его в файл.
Следующая команда будет копировать содержимое с помощью ( оператора):
Обычно вы используете команду для копирования файла.
Если файл не существует, команда создаст его. В противном случае файл будет перезаписан.
Используйте ( оператор) , чтобы добавить содержимое из к :
То же, что и раньше, если файл отсутствует, он будет создан.
Опция позволяет визуально различать вкладки и пробелы.
Символы табуляции будут отображаться как .
Показать конец строк
Чтобы отобразить невидимый символ окончания строки, используйте аргумент:
Окончания строк будут отображаться как .
Set-Content
Set-Content — это командлет обработки строк, который записывает новое содержимое или заменяет содержимое в файле. Set-Content заменяет существующее содержимое и отличается от командлета Add-Content, который добавляет содержимое в файл. Чтобы отправить контент в Set-Content, вы можете использовать параметр -Value в командной строке или отправить контент через конвейер.
Например, следующие команды равнозначны:
Get-Help about_Comparison_Operators -Full > man.txt Get-Help about_Comparison_Operators -Full | Set-Content man.txt
Вместо Set-Content вы можете использовать встроенный псевдоним этой команды «sc».
Set-Content предназначен для обработки строк. Если вы передаёте нестроковые объекты по конвейеру Set-Content, он преобразует объект в строку перед её записью. Для записи объектов в файлы используйте Out-File.
Командлет Set-Content разработан для работы с данными, предоставляемыми любым провайдером. Чтобы вывести список поставщиков, доступных в вашем сеансе, введите
Get-PsProvider
Имя файла можно указать с опцией -Path, например, следующие команды равнозначны:
Get-Help about_Comparison_Operators -Full | Set-Content man.txt Get-Help about_Comparison_Operators -Full | Set-Content -Path man.txt
Опции -Path можно найти применение, поскольку она поддерживает подстановочные символы, например:
Get-Help about_Comparison_Operators -Full | Set-Content -Path man.txt
Предыдущая команда НЕ означает, что будет созданы 3 файла с именами man1.txt, man2.txt, man3.txt и одинаковым содержимым. Эта команда означает, что будет выполнен поиск файлов по указанному образцу, и если таких файлов нет, то программа завершиться ошибкой.
При рабоче с группой файлов вы можете комбинировать с опцией -Path опцию -Exclude (исключить файлы по указанному шаблону) и опцию -Include (включить файлы по указанному шаблону). Обе эти опции также поддерживают подстановочные знаки.
При записи в файл, в конец будет добавлен символ перехода на новую строку. То есть если в файл будут добавлены другие данные, то они будут записаны с новой строки. Если вы не хотите, чтобы добавлялся символ новой строки, то используйте опцию -NoNewline. Если для формирования вывода используется несколько строк, то по умолчанию они разделяются пробелом, эта опция также отменяет вставку пробелов между строк.
Выше показаны примеры передачи строк для сохранения в файл по контейнеру (трубе), строку или объект также можно указать с опцией -Value:
Set-Content -Value "String to save" str.txt
По умолчанию Set-Content не выводит на экран сохраняемые строки, вы можете одновременно с сохранением файла вывести содержимое по конвейеру, для этого добавьте опцию -PassThru. Если в конвейере отсутствуют последующие командлеты, то содержимое будет показано в стандартном выводе (в консоли).
Опция -AsByteStream указывает, что содержимое следует читать как поток байтов. Этот параметр был введён в PowerShell 6.0. Предупреждение возникает при использовании параметра -AsByteStream с параметром -Encoding. Параметр AsByteStream игнорирует любую кодировку, и выходные данные возвращаются в виде потока байтов.
Опция -Encoding задаёт тип кодировки для целевого файла. Значение по умолчанию — UTF8NoBOM. Кодировка — это динамический параметр, который поставщик FileSystem добавляет в Set-Content. Этот параметр работает только на дисках с файловой системой. Допустимые значения этого параметра следующие:
- ASCII: использует кодировку для набора символов ASCII (7-бит).
- BigEndianUnicode: кодирует в формате UTF-16, используя порядок байтов с прямым порядком байтов.
- OEM: использует кодировку по умолчанию для MS-DOS и консольных программ.
- Unicode: кодируется в формате UTF-16 с использованием порядка байтов с прямым порядком байтов.
- UTF7: кодирует в формате UTF-7.
- UTF8: кодирует в формате UTF-8.
- UTF8BOM: кодирует в формате UTF-8 с меткой порядка байтов (BOM)
- UTF8NoBOM: кодирует в формате UTF-8 без метки порядка байтов (BOM)
- UTF32: кодирует в формате UTF-32.
Начиная с PowerShell 6.2, параметр -Encoding также позволяет использовать числовые идентификаторы зарегистрированных кодовых страниц (например, «-Encoding 1251») или строковые имена зарегистрированных кодовых страниц (например, «-Encoding «windows-1251″».
Передача ключей и значений в одной переменной (Splatting)
Обычный вызов команды выглядит следующим образом:
Мы можем взять все ключи и значения из этой команды, поместить в hashtable и передать в команду как набор параметров:
Что бы Powershell понял, что мы передаем не одну переменную, а набор ключей и значений, мы должны ее пометить знаком ‘@’:
Такой подход называется ‘Splatting’ (брызги) и немного повышает читаемость кода.
Если в hashtable будет находиться дополнительный параметр, который не реализован в команде, то выйдет ошибка:
- Не удается найти параметр, соответствующий имени параметра
- A parameter cannot be found that matches parameter name
Обычные массивы так тоже можно передавать, но вы должны знать позиции под которыми должны располагаться значения:
Используя splatting, в Powershell 7+, вы можете перезаписывать значения из метода splatting:
Фильтрация по левому краю
Результаты команд, приведенные в этой главе, отфильтрованы по подмножеству. Например, использовался с параметром Name для фильтрации списка служб, которые были возвращены только службе времени Windows.
В конвейере всегда нужно как можно раньше отфильтровать результаты по параметрам поиска. Это выполняется с помощью параметров в первой команде или той, которая расположена в крайнем левом углу.
Иногда этот способ называется фильтрация слева.
В следующем примере используется параметр Name для немедленной фильтрации результатов только в службе времени Windows.
Нередко встречаются примеры, в которых команда передается для выполнения фильтрации.
В первом примере фильтрация выполняется в источнике и результаты возвращаются только для службы времени Windows.
Во втором примере возвращаются все службы, а затем они передаются другой команде для выполнения фильтрации
Хотя это может быть не так важно в следующем примере, но представьте, что вы запрашиваете список пользователей Active Directory. Вы точно хотите вернуть данные для нескольких тысяч учетных записей пользователей из Active Directory только для передачи их в другую команду, которая фильтрует учетные записи в небольшом подмножестве? Я советую всегда выполнять фильтрацию по левому краю, даже если это кажется неважным
Вы привыкнете использовать этот способ и будете выполнять фильтрацию по левому краю автоматически, когда это действительно важно.
Однажды мне кто-то сказал, что порядок, в котором указываются команды, не имеет значения. Это далеко от истины. Порядок, в котором указываются команды, действительно важен при выполнении фильтрации. Например, рассмотрим ситуацию, при котором вы используете , чтобы выбрать только несколько свойств, и для фильтрации по свойствам, которые не будут находиться в выделенном фрагменте. В этом сценарии фильтрация должна выполняться первой, иначе свойство не будет существовать в конвейере при попытке выполнить фильтрацию.
Команда в предыдущем примере не возвращает результаты, так как свойство CanStopAndContinue не существует при передаче результатов из в . Именно это свойство было «не выбрано». По сути, оно было отфильтровано. Обратная последовательность и выдает нужные результаты.
Фильтрация вывода
У нас есть базовые свойства, которые фильтруются с помощью Filter. Это:
- DistinguishedName
- Enabled
- ObjectClass
- ObjectGUID
- SamAccountName
- SID
- UserPrincipalName
И ряд свойств, которые возвращаются с параметром Properties. Их можно фильтровать через дополнительные условия (конвейер, where-object, циклы). Имена этих свойств можно вернуть так:
Использование Filter
Если вы планируете получить информацию по определенному доменному компьютеру, то вам нужно добавить условие. В примере ниже я возвращаю информацию только по компьютеру у которого имя равно «AD1»:
Если нужно найти только компьютеры, которые содержат в имени определенные значения, то нужно использовать -like вместо -eq . В моем примере я ищу все компьютеры содержащие в имени «CL» (регистр не учитывается).
Знаки * говорят, что в этих местах может быть еще текст. Такое написание «C*L» соответствовало бы логике: строка начинается с буквы «C», затем может быть еще текст завершающийся на «L».
Использование Properties
Свойства возвращаемые через ключ Properties можно фильтровать двумя способами.
Первый — указывать их явно. Например вы хотите вернуть список с датами создания учетных записей компьютеров домена, которые хранит свойство «Created». Это можно сделать так:
Указать больше свойств можно через запятую. Например:
Так же можно фильтровать через команду where-object. На примере ниже я получаю компьютеры со всеми свойствами, но созданные до 31 декабря 2019 года:
Ограничить вывод определенными свойствами можно через Select:
Получение включенных и отключенных учетных записей
Используя свойства Enabled можно вернуть учетные записи активных и деактивированных записей. Так будут возвращены отключенные учетные записи: