Как сделать файл для powershell

Обновлено: 07.07.2024

Чтобы определить путь к текущему каталогу, введите команду Get-Location.

Командлет Get-Location аналогичен команде pwd в оболочке BASH. Командлет Set-Location аналогичен команде cd в Cmd.exe.

Настройка текущего расположения (Set-Location)

Команда Get-Location используется с командой Set-Location. Команда Set-Location позволяет вам указать расположение текущего каталога.

Обратите внимание, что после ввода команды вы не получите прямого отклика о действии команды. Большинство команд Windows PowerShell, выполняющих действия, практически не создают выходных данных, так как выходные данные не всегда полезны. Чтобы проверить успешность внесения изменения в каталог при вводе команды Set-Location, укажите параметр -PassThru при вводе команды Set-Location.

Параметр -PassThru можно использовать с некоторыми командами Set в Windows PowerShell для возврата сведений о результате, когда отсутствуют выходные данные по умолчанию.

Вы можете указать пути относительно текущего расположения так же, как и в большинстве командных оболочек UNIX и Windows. В стандартной нотации для относительных путей точка ( . ) представляет текущую папку, а две точки ( .. ) — родительский каталог текущего расположения.

Например, если вы находитесь в папке C:\Windows, точка ( . ) представляет C:\Windows, а две точки ( .. ) представляют C: . Текущее расположение можно изменить на корень диска C: путем ввода следующей команды:

Тот же метод работает для дисков Windows PowerShell, которые не являются дисками файловой системы, например HKLM: . В реестре в качестве расположения можно задать раздел HKLM\Software путем ввода следующего кода:

После этого можно изменить расположение каталога на родительский каталог, который является корнем диска Windows PowerShell HKLM: с помощью относительного пути:

Вы можете ввести Set-Location или использовать любой из встроенных псевдонимов Windows PowerShell для Set-Location (cd, chdir, sl). Пример:

Сохранение и отзыв последних расположений (Push-Location и Pop-Location)

Например, Windows PowerShell обычно запускается в корневом каталоге пользователя.

Чтобы передать текущее расположение в стек, а затем переместить его в папку локальных параметров, введите:

После этого можно передать расположение локальных параметров в стек и переместить его в папку Temp, введя следующее:

Чтобы убедиться, что каталоги изменены, введите команду Get-Location.

После этого можно перейти в последний открытый каталог, введя команду Pop-Location, и проверить изменение, введя команду Get-Location.

Как и в случае с командлетом Set-Location, можно включить параметр -PassThru при вводе командлета Pop-Location, чтобы открыть указанный каталог.

Кроме того, можно использовать командлеты расположения с сетевыми путями. Если у вас есть сервер FS01 с общей папкой Public, можно изменить расположение, введя

или диспетчер конфигурации служб

Чтобы изменить расположение на любой доступный диск, можно использовать команды Push-Location и Set-Location. Например, если у вас есть локальный дисковод компакт-дисков с буквой диска D, содержащий компакт-диск с данными, вы можете изменить расположение на него, введя команду Set-Location D: .

Работа с файлами и папками. Получение списка файлов и папок, содержащихся в папке.

Извлечь все элементы непосредственно из папки можно с помощью командлета Get-ChildItem . Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Например, эта команда отображает непосредственное содержимое диска C Windows PowerShell (которое совпадает с содержимым физического диска C Windows):

Эта команда выводит только элементы, содержащиеся на диске непосредственно, так же как и команда DIR оболочки Cmd.exe или команда ls оболочки UNIX. Для показа вложенных элементов необходимо также указать параметр -Recurse . (Время выполнения этой операции будет очень велико.) Для вывода всего содержимого диска C введите:

Командлет Get-ChildItem позволяет отфильтровать элементы с помощью параметров Path, Filter, Include и Exclude, но обычно осуществляется лишь фильтрация по имени. Сложную фильтрацию на основе других свойств элементов можно выполнить с помощью Where-Object .

Следующая команда находит все исполняемые файлы в папке Program Files, которые были в последний раз изменены после 1 октября 2005 г. и размер которых не менее одного мегабайта и не более десяти мегабайт:

Копирование файлов и папок

Копирование выполняется с помощью командлета Copy-Item . Следующая команда создает резервную копию C:\boot.ini в C:\boot.bak:

Если целевой файл уже существует, то попытка копирования завершается неудачей. Чтобы перезаписать имеющийся целевой файл, используйте параметр Force.

Эта команда работает, даже если целевой объект доступен только для чтения.

Так же выполняется и копирование папок. Эта команда копирует папку C:\temp\test1 в новую папку C:\temp\DeleteMe рекурсивно.

Можно также скопировать избранные элементы. Следующая команда копирует все файлы TXT, содержащиеся в папке C:\data , в папку C:\temp\text :

Для копирования элементов файловой системы можно использовать и другие средства. В Windows PowerShell по-прежнему работают команды XCOPY, ROBOCOPY и такие COM-объекты, как Scripting.FileSystemObject. Например, можно воспользоваться COM-классом Scripting.FileSystem сервера сценариев Windows для создания резервной копии файла C:\boot.ini в файле C:\boot.bak :

Создание файлов и папок

Создание новых элементов осуществляется одинаковым образом всеми поставщиками Windows PowerShell. Если поставщик Windows PowerShell поддерживает более одного типа элементов (например, поставщик Windows PowerShell FileSystem различает каталоги и файлы), необходимо указать тип элемента.

Эта команда создает папку C:\temp\New Folder :

Эта команда создает пустой файл C:\temp\New Folder\file.txt .

При использовании параметра Force с командой New-Item для создания папки, которая уже существует, она не перезапишет и не заменит папку. Будет просто возвращен имеющийся объект папки. Однако, если использовать New-Item -Force в уже имеющимся файле, файл будет полностью перезаписан.

Удаление всех файлов и папок, содержащихся в папке

Удалить вложенные элементы можно с помощью командлета Remove-Item , однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. Например, при попытке удаления папки C:\temp\DeleteMe , которая содержит другие элементы, Windows PowerShell предварительно предложит подтвердить удаление этой папки:

Если подтверждение для каждого вложенного элемента нежелательно, задайте параметр Recurse:

Подключение локальной папки как диска

Отобразить локальную папку можно с помощью команды New-PSDrive . Следующая команда создает локальный диск P: , корневым каталогом которого является локальный каталог Program Files, отображающийся только в сеансе PowerShell:

Как и при использовании сетевых дисков, диски, отображенные в Windows PowerShell, немедленно становятся доступными оболочке Windows PowerShell. Чтобы создать подключенный диск, отображающийся в проводнике, нужен параметр -Persist . Но с этим параметром можно использовать только удаленные пути.

Чтение текстового файла в массив

Одним из наиболее общих форматов хранения текстовых данных является файл, отдельные строки которого рассматриваются как отдельные элементы. Командлет Get-Content используется для чтения всего файла за один шаг, как показано далее:

Командлет Get-Content сразу рассматривает данные, считанные из файла, как массив с одним элементом на строку содержимого файла. Убедиться в этом можно, проверив свойство Length полученного содержимого:

Эта команда наиболее полезна для непосредственного ввода в Windows PowerShell информационных списков. Например, можно хранить в файле C:\temp\domainMembers.txt список имен компьютеров или IP-адресов по одному имени на каждую строку файла. Вы можете использовать командлет Get-Content , чтобы извлечь содержимое файла и поместить его в переменную $Computers :

Теперь переменная $Computers представляет собой массив, содержащий в каждом элементе имя компьютера.

Работа с файлами, папками и разделами реестра

Перечисление файлов, папок и разделов реестра (Get-ChildItem)

Так как получение коллекции элементов из определенного расположения является обычной задачей, командлет Get-ChildItem разработан специально для возврата всех элементов, найденных в контейнере, например в папке.

Если необходимо вернуть все файлы и папки, которые находятся непосредственно в папке C:\Windows, введите:

Списки выглядят аналогично тем спискам, которые появляются при вводе команды dir в Cmd.exe или команды ls в командной оболочке UNIX.

С помощью параметров командлета Get-ChildItem можно создавать очень сложные списки. Далее рассмотрим несколько сценариев. Синтаксис командлета Get-ChildItem можно увидеть, введя:

Эти параметры можно скомбинировать и сопоставить для получения настраиваемых выходных данных.

Перечисление всех элементов в контейнере (-Recurse)

Чтобы увидеть оба элемента в папке Windows и все элементы во вложенных папках, используйте параметр Recurse для Get-ChildItem. В списке отображается все, что находится в папке Windows, а также элементы в ее вложенных папках. Пример:

Фильтрация элементов по имени (-Name)

Чтобы отобразить только имена элементов, используйте параметр Name для Get-Childitem:

Принудительное перечисление скрытых элементов (-Force)

В выходных данных команды Get-ChildItem не отображаются элементы, которые обычно невидимы в проводнике или Cmd.exe. Чтобы показать скрытые элементы, используйте параметр Force для Get-ChildItem. Пример:

Этот параметр называется Force, так как позволяет принудительно переопределить обычное поведение команды Get-ChildItem. Параметр Force широко используется для принудительного выполнения действия командлетом. Тем не менее, он не будет выполнять действия, компрометирующие систему безопасности.

Сопоставление имен элементов с подстановочными знаками

Команда Get-ChildItem допускает подстановочные знаки в пути к перечисляемым элементам.

Так как сопоставление с подстановочными знаками обрабатывается подсистемой Windows PowerShell, все командлеты, которые принимают подстановочные знаки, используют одну нотацию и имеют одно поведение сопоставления. В нотацию подстановочных знаков Windows PowerShell входит:

  • Звездочка (*) — соответствует нулю или большему количеству вхождений любого символа.
  • знак вопроса (?) — соответствует ровно одному символу;
  • Открывающая квадратная скобка ([) и закрывающая квадратная скобка (]) — заключают в себя набор символов для сопоставления.

Далее приводится несколько примеров работы спецификации из подстановочных знаков.

Чтобы найти в каталоге Windows все файлы, имеющие суффикс .log и ровно пять символов в основном имени, введите следующую команду:

Чтобы найти в каталоге Windows все файлы с именами, начинающимися на букву x, введите:

Чтобы найти все файлы с именами, начинающимися на x или z, введите:

Исключение элементов (-Exclude)

Вы можете исключить определенные элементы с помощью параметра Exclude для Get-ChildItem. Это позволит вам выполнить сложную фильтрацию в одном операторе.

Смешение параметров Get-ChildItem

В одной команде можно использовать несколько параметров Get-ChildItem. Перед тем как комбинировать параметры, убедитесь, что понимаете принципы сопоставления подстановочных знаков. Например, следующая команда не возвращает результатов:

Результаты отсутствуют, даже если существуют две библиотеки, которые начинаются на букву z в папке Windows.

Результаты не возвращены, так как подстановочный знак указан как часть пути. Хотя команда и была рекурсивной, командлет Get-ChildItem ограничил элементы до тех, которые находятся в папке Windows с именами, заканчивающимися на .dll.

Чтобы указать рекурсивный поиск для файлов, имена которых соответствуют специальному шаблону, используйте параметр -Include.

Работа с записями реестра. Создание списков записей реестра.

Существует несколько способов просмотра реестра. Самый простой — получить имена свойств, связанные с разделом. Например, чтобы просмотреть имена записей в разделе реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion , используйте Get-Item . Разделы реестра содержат свойство с универсальным именем Property, которое является списком записей реестра в разделе. Следующая команда выбирает свойство Property и расширяет элементы так, чтобы они отображались в списке:

Чтобы просмотреть записи реестра в более удобочитаемой форме, используйте Get-ItemProperty .

Все свойства Windows PowerShell раздела имеют префиксы PS, например PSPath, PSParentPath, PSChildName и PSProvider.

Для создания ссылки на текущее расположение можно использовать нотацию *.* . Set-Location можно использовать для изменения значения на контейнер реестра CurrentVersion.

Кроме того, можно использовать встроенный диск HKLM PSDrive с Set-Location .

Затем можно использовать нотацию *.* для текущего расположения, чтобы перечислить свойства без указания полного пути.

Расширение пути работает так же, как и в файловой системе, поэтому в этом расположении можно получить перечисление ItemProperty для HKLM:\SOFTWARE\Microsoft\Windows\Help с помощью Get-ItemProperty -Path ..\Help .

Получение одной записи реестра

Если необходимо получить конкретную запись в разделе реестра, можно использовать один из нескольких возможных подходов. Этот пример получает значение DevicePath в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion .

Вместе с Get-ItemProperty используйте параметр Path, чтобы указать имя раздела и параметр Name, а также имя записи DevicePath.

Эта команда возвращает стандартные свойства Windows PowerShell, а также свойство DevicePath.

Хотя Get-ItemProperty содержит параметры Filter, Include и Exclude, их нельзя использовать для фильтрации по имени свойства. Эти параметры относятся к разделам реестра (путям элементов), а не записям реестра. Записи реестра — это свойства элементов.

Другой вариант — использовать средство командной строки Reg.exe. Для получения справки по reg.exe введите reg.exe /? в командной строке. Чтобы найти запись DevicePath, используйте reg.exe, как показано в следующей команде:

Настройка одной записи реестра

Если необходимо изменить определенную запись в разделе реестра, можно использовать один из нескольких подходов. Этот пример изменяет запись Path в разделе HKEY_CURRENT_USER\Environment . Запись Path указывает расположение для поиска исполняемых файлов.

  1. Получите текущее значение записи Path с помощью Get-ItemProperty .
  2. Добавьте новое значение, отделив его с помощью ; .
  3. Используйте Set-ItemProperty с указанным разделом, именем записи и значением, чтобы изменить запись реестра.

Хотя Set-ItemProperty содержит параметры Filter, Include и Exclude, их нельзя использовать для фильтрации по имени свойства. Эти параметры относятся в разделам реестра (путям элементов), а не к записям реестра (свойствам элементов).

Другой вариант — использовать средство командной строки Reg.exe. Для получения справки по reg.exe введите reg.exe /? . в командной строке.

В следующем примере запись Path изменяется за счет удаления пути, добавленного в предыдущем примере. Get-ItemProperty по-прежнему используется для получения текущего значения, исключая анализ строки, возвращаемой reg query . Методы SubString и LastIndexOf используются для получения последнего добавленного пути в запись Path.

Создание новых записей реестра

Чтобы добавить новую запись реестра с именем PowerShellPath в раздел CurrentVersion, используйте New-ItemProperty с путем к разделу, именем записи и значением записи. В этом примере используется значение переменной Windows PowerShell $PSHome , в которой хранится путь к каталогу установки Windows PowerShell.

Вы можете добавить новую запись в раздел с помощью следующей команды, и команда также вернет сведения о новой записи:

Значение PropertyType должно быть именем элемента перечисления Microsoft.Win32.RegistryValueKind из следующей таблицы:

ТАБЛИЦА 1
Значение PropertyType Значение
Двоичные данные Двоичные данные
DWord Число, которое является допустимым UInt32
ExpandString Строка, которая может содержать динамически раскрывающиеся переменные среды
MultiString Многострочная строка
String Любое строковое значение
QWord 8 байтов двоичных данных

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

Кроме того, можно перезаписать существующее значение записи реестра, добавив параметр Force в любую команду New-ItemProperty .

Переименование записей реестра

Чтобы переименовать запись PowerShellPath в PSHome, используйте Rename-ItemProperty .

Чтобы отобразить переименованное значение, добавьте параметр PassThru в команду.

Удаление записей реестра

Чтобы удалить записи реестра PSHome и PowerShellPath, используйте Remove-ItemProperty .

Запуск Powershell

На примере Windows 10 Powershell можно запустить просто нажав правой кнопкой мыши на меню пуск.


Также нижняя строчка позволяет запустить Powershell с повышенными правами администратора.

Еще можно воспользоваться поиском в WIndows 10 и ввести название powershell


Как видно на картинке выше нашелся не только Powershell но и Powershell ISE. Консоль powershell удобна если требуется запустить последовательно не больше одной команды. Либо несколько команд в конвейере. Однако в случае написания полноценных скриптов лучше использовать Powershell ISE. Это бесплатная среда разработки сценариев на языке Powershell поставляется вместе с ОС Windows.


Окно Powershell


Окно Powershell ISE

Сразу после запуска консоли рекомендую запустить командлет Get-Help — встроенная справка по всем командлетам, аналог man в Linux.


Get-Help

Видим что консоль предлагает обновить встроенную помощь. Нажимаем Y и соглашаемся.

Командлеты

Командлеты — это название команд в Powershell. Каждый командлет реализует заложенную в него функциональность. Как правило наименование командлета состоит из пары: глагол-существительное. Например: Get-Help — получить помощь. Обычно Get используется чтобы получить информация, Set — внести изменение, New — создать новый объект, политику и т.п. и Remove -удалить объект, политику и т.п.

Командлеты не чувствительны к регистру. Написать Get или get не важно, powershell воспримет эти команды одинаково.

Чтобы получить список всех доступных командлетов необходимо использовать Get-Command


Get-Command

Для получения справки по любому командлету напишите Get-Help имя-комндлета. Например


Давайте представим что нам необходимо вывести список командлетов для управления процессами. Воспользуемся Get-Command и укажем ему параметры для более точного поиска.


Get-Command *Process*

И вот мы видим список командлетов позволяющих управлять процессами: Get-Process — список всех запущенных процессов, Start-Process — запустить указанный процесс, Stop-Process— остановить указанный процесс, Wait-Process — ожидать указанный процесс. Как видно из названий командлетов можно легко понять для чего каждый служит.

Используя командлет Get-Help можно получить справку по любому командлету.

При использовании командлета есть возможность указать несколько параметров при запуске. Первый параметр можно не называть. Выше я писал Get-Command *Process* где указал поиск командлетов со словом Process. Однако я не написал параметр -Name, хотя именно его и указал. Если полностью то поиск по имени выглядит так: Get-Command -Name *Process* . В случае отсутствия непосредственного указания -Name Powershell принимает в качестве имени введенное слово *Process*.

Давайте выведем список процессов с именем WhatsApp


Get-Process

Мы вывели все процессы с именем WhatsApp и добавили в вывод дополнительный параметр -IncludeUserName, что позволило нам увидеть кем запущен процесс.

Алиасы

Алиасы в Powershell это по сути более короткие названия командлетов. Т.е. любому командлету можно присвоить свое короткое имя (alias). Например алиасом для командлета Get-Process является gps. Согласитесь куда проще и быстрее написать gps чем Get-Process.

Список всех alias можно получить используя командлет Get-Alias

Как видно из списка для alias использованы аналогичные по значению команды из Linux: ls, man, mount, md, kill и т.п. Видимо чтобы линуксоиду было по привычнее 🙂 Можно создать свой alias используя командлет New-Alias

Конвейер

Конвейер используется для передачи выходных данных командлета идущего вначале во входные данные командлета следующего за ним. Ничего непонятно? 🙂 Давайте на примерах, так всегда яснее.

Возьмем уже известный нам командлет Get-Process, посмотрим на его вывод


Get-Process

Как по мне многовато лишних столбцов. Мне эта информация не нужна, поэтому я выберу только нужные данные. Для таких целей служит командлет Select-Object. Давайте используем его в конвейере.


Get-Process|Sort-Object

Как вы уже наверно догадались конвейер обозначается знаком | и идет сразу следом за командлетом. И так данные по конвейеру можно передавать и дальше другим командлетам. Итак я передал выходные данные (список запущенных процессов) на вход командлета Select-Object. Который в свою очередь выбрал данные по 3 столбцам ID, CPU, ProcessName. Теперь можно передать эти данные дальше. Например выгрузить в текстовый файл

Просто не правда ли? У нас конвейер из трех командлетов, на выходе которого получаем текстовый файл со списком запущенных процессов и необходимой информацией по ним.

Структура объектов

В Powershell объекты играют самую важную роль. От типа объекта зависит что именно с ним можно сделать. Узнать тип объекта и вывести список всех его элементов позволяет команда Get-Member


Get-Process|get-Member

Вот далеко не полный список элементов командлета Get-Process. В данному случае тип данных это System.Diagnostics.Process

Давайте посмотрим тип данных у новой переменной


Get-Member String

В данном случае тип данных System.String т.е. строка. Что вполне логично. А теперь посмотрите что можно сделать с этой строкой с учетом указанных выше параметров.


Get-Member methods

Как видно на картинке выше мы заключаем нашу тестовую переменную $new в скобки и после них пишем точку и указываем метод. В примере я использовал три метода:

  • ToUpper — перевод всех букв в строке в верхний регистр
  • ToLower — перевод всех букв в строке в нижний регистр
  • Length — подсчитать количество символов в строке

Это всего лишь небольшой пример что можно сделать с параметрами объекта. Чаще используйте Get-Member и вы откроете для себя безграничные возможности манипуляции над объектами.

Скрипты Powershell

В самом начале статьи указал на встроенный инструмент Powershell ISE. Давайте запустим его и создадим свой первый скрипт. Кстати скрипты сохраняются в файлах с расширением ps1


Powershell скрипты

В этом скрипте я использовал цикл if else. О циклах будет подробнее в следующей статье. Итак давайте сохраним скрипт и выполним его.

В ответ мы получим такую ошибку:

Все верно, изначально в WIndows запрещено выполнять скрипты Powershell. Это сделано для повышения безопасности системы. Для включения возможности запуска скриптов Powershell необходимо запустить Powershell от Администратора и ввести командлет Set-ExecutionPolicy с одним из параметров:

  • Restricted — политика по умолчанию. Выполнение всех скриптов запрещено
  • RemoteSigned — разрешено запускать собственные скрипты и подписанные доверенным разработчиком
  • AllSigned — разрешено запускать скрипты, подписанные доверенным разработчиком. Каждый раз перед запуском такого скрипта PowerShell будет запрашивать подтверждение
  • Unrestricted — в системе разрешается запускать любые скрипты

Если вы полностью уверены в запускаемых скриптах можете поставить Unrestricted. Давайте так и сделаем


Set-ExecutionPolicy

Будет предупреждение по безопасности, соглашаемся нажав Y

Можем посмотреть текущую настройку политики безопасности при помощи командлета Get-ExecutionPolicy


Get-ExecutionPolicy

В данной статье мы рассмотрели основы чтобы подготовиться писать скрипты Powershell. В следующих статьях мы более подробно изучим циклы, массивы, функции, работу со строками и много другое. Кстати вот раздел посвященный Powershell. Там много всего интересного 😉

В данной статье описано, как записать и получить данные из файла при работе с PowerShell.

Операторы перенаправления.

Рассмотрим ещё один пример:

+ CategoryInfo : ObjectNotFound : ( C : \ temp \ skdjfsdlj : String ) [ Get-ChildItem ] , ItemNotFoundException

+ CategoryInfo : ObjectNotFound : ( C : \ temp \ skdjfsdlj : String ) [ Get-ChildItem ] , ItemNotFoundException

После выполнения команды в файле будет записан как и результат выполнения команды, так и ошибки:

+ CategoryInfo : ObjectNotFound : ( C : \ temp \ asdfsadf : String ) [ Get-ChildItem ] , ItemNotFoundException

В этом примере мы перенаправили второй поток вывода в первый, а первый поток записали в файл.

В PowerShell существуют следующие потоки:

Set-Content, Add-Content

Так же для записи в файл можно использовать командлеты Set-Content и Add-Content. Эти командлеты заменяет все данные в файле на указанные. Перед записью они преобразовывают объекты в строки и не всегда удобны. Зато они могут использоваться для массового изменения файлов. Простейшая их запись выглядит так:

При работе с файловой системой командлеты могут применять следующие параметры:

В этом параметре нужно указывать новое содержимое элементов.

Название параметра можно опустить, тогда предыдущие примеры будет выглядеть так:

Данный параметр, так же можно передавать по контейнеру.

Но в файл попадут не данные как на консоли, а преобразованные в текстовые строки объекты.

Тоже самое произойдёт, если в параметр -value передать переменную:

или можно добавить данные:

Данный параметр подставляется автоматически если его не указывать явно и в нём указываются шаблон для файлов, которые будут подвергаться изменению.

-Force

+ FullyQualifiedErrorId : System . UnauthorizedAccessException , Microsoft . PowerShell . Commands . SetContentCommand

Тоже самое и для Add-Content:

+ FullyQualifiedErrorId : System . UnauthorizedAccessException , Microsoft . PowerShell . Commands . SetContentCommand

В этом параметре можно указать шаблон имени файла.

PS C : \ temp > Set-content -Path "C:\temp\*" , "C:\temp2\*" -Include "*.doc" , "*.txt" -value "33" -Exclude "1.txt"

или добавить содержимое:

PS C : \ temp > Add-Content -Path "C:\temp\*" , "C:\temp2\*" -Include "*.doc" , "*.txt" -value "33" -Exclude "1.txt"

Так же и для Add-Content:

-PassThru

Данный параметр позволяет передать объекты дальше по контейнеру, или вывести объекты на консоль, если данный командлет является последним.

Address Method System . Object & , mscorlib , Version =2 . 0 . 0 . 0 , Culture = neutral , PublicKeyToken = b77a5c561934 . . .

CopyTo Method System . Void CopyTo ( array array , int index ) , System . Void CopyTo ( array array , long index )

-Confirm

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

[ Y ] Да - Y [ A ] Да для всех - A [ N ] Нет - N [ L ] Нет для всех - L [ S ] Приостановить - S [ ? ] Справка

Данные командлеты позволяют писать в файл только строки, для записи в файл объектов используются следующие командлеты:

Out-File

В простейшем варианте этот командлет выглядит так:

Out-File может принимать следующие параметры:

В этом параметре нужно указывать имя файла или полный путь до файла в который будет записаны данные.

Имя данного параметра можно опустить, как мы и сделали в предыдущем примере.

Полная запись будет выглядеть так:

-Append

При указании данного параметра данные будут дописываться, а не затираться.

Тоесть если мы запустим команду:

-NoClobber

Данный параметр предотвращает перезапись существующих данных.

Если запусnить команду :

При уже имеющемся файле 2.txt

То получится ошибка:

Однако с параметром -Append

Сохранности данных ничего не угрожает и данные благополучно допишутся в конец файла.

-Confirm

Параметр указывает, что перед выполнением команды у пользователя будет запрошено подтвержение.

При выполнении данной команды:

[ Y ] Да - Y [ A ] Да для всех - A [ N ] Нет - N [ L ] Нет для всех - L [ S ] Приостановить - S [ ? ] Справка

-Force

То есть команда:

PowershellAndFiles3

При этом после записи в этот файл, галка не уберётся.

Данный параметр позволяет сохранять в файл объект. При этом отображение этого объекта в консоли и сохраннёные данные в файл, могут визуально не совпадать

Например создадим вложенный массив :

Посмотрим на массив:

В данном примере и в файле и в консоле будет одно и тоже:

Запишем объект массива в файл, через параметр -InputObject:

Теперь в консоли будет выводиться :

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

Получился вот такой файл:

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

Tee-Object

Этот командлет сохраняет отображаемые объекты и передаёт их дальше по контейнеру.

-FilePath

Так же с помощью свойства

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

После выполнения этой команды в переменной $listfile будет содержаться объект типа System.IO.FileInfo

Так же как и в Out-File в Tee-Object можно передать переменную на командлет:

Только в PoverShell 3.0 Tee-Object научился дописывать в файл с помощью параметра

-Append

При использовании данного параметра файл будет не перезаписываться, а данные будут дописываться в конец файла.

После выполнения данной командой данные допишутся в конец файла 3.txt, а не будут перезаписывать файл.

Get-Content

Для того, что бы получать данные из текстовых файлов, имеется командлет Get-Content.

У него есть ряд параметров, которые работают так же как и в Set-Content:

Задает путь к элементу. В отличие от значения параметра Path, значение параметра LiteralPath используется точно в том виде, в котором оно введено. Никакие символы не интерпретируются как подстановочные знаки. Если путь включает escape-символы, его нужно заключить в одиночные кавычки. Одиночные кавычки указывают оболочке Windows PowerShell, что никакие символы не следует интерпретировать как escape-символы.

PS C : \ Temp > Get-content -LiteralPath C : \ temp \ 1 . txt , C : \ temp \ 1 . txt , C : \ temp \ 1 . txt

PS C : \ Temp > Get-content -LiteralPath C : \ temp \ 1 . txt , C : \ temp \ 1 . txt , C : \ temp \ 1 . txt | set-content 4 . txt

Задает фильтр с использованием формата или языка поставщика. Значение этого параметра определяет значение параметра Path. Синтаксис фильтра, в том числе использование подстановочных знаков, зависит от поставщика. Фильтры эффективнее других параметров, потому что поставщик применяет их при извлечении объектов (вместо использования Windows PowerShell для фильтрации извлеченных объектов).

PS C : \ Temp > Get-content -Path C : \ temp \ * , C : \ temp2 \ * -filter * . csv | set-content 5 . csv

Get-Content : Объект для указанного пути C : \ temp \ * не существует или отфильтрован с помощью параметра -Include или -Exc

-Force

И два особенных параметра:

Данный параметр задает количество извлекаемых строк содержимого. По умолчанию используется значение -1 (все строки).

Данная команда вывела ровно 5 строк из файла 1.txt

Задаёт количество строк передаваемых по конвееру.

На примере видно, что строки передаются по 5 штук.

Если вывод происходит на консоль, то большое число в данном параметре может существенно увеличить скорость выдачи информации, но увеличит время ожидания до выдачи первых строк.

Данные команды конечно расширяют возможности работы с данными в файлах Powershell, но полученные данные с помощью операторов перенаправления или командлетами Out-File и Tee-Object больше подходят для логирования процессов, нежели для анализа данных. К тому же использовать полученные данные в дальнейших скриптах не тривиальная задача. Для решения этих проблем в PowerShell есть командлеты Import-CSV,Export-CSV, Export-Clixml, Import-Clixml. Рассмотрим их по отдельности:

Export-CSV

Раз я веду разговор о записи в файл, именно этот командлет мне нужен. Но стоит упоменуть о командлете ConvertTo-CSV. Так как Export-CSV выполняет все действия ConvertTo-CSV, а после записывает в файл. Поэтому если вам не хватает функционала работы с файлами командлета Export-CSV то вы можете конвертировать объекты PowerShell с помощью ConvertTo-CSV, а помом записать полученный результат удобным вам способом.

Рассмотрим свойства данного командлета:

Данный параметр обязательный и задаёт имя файла, в который будут записываться данные.

В этой статье про PowerShell для начинающих мы посмотрим, как писать скрипты, которые помогают оптимизировать управление Windows-окружением.

PowerShell — это объектно-ориентированный программный движок и скриптовый язык с интерфейсом командной строки, предоставляющий широкие возможности для конфигурирования операционных систем семейства MS Windows. Он предлагает как чисто консольный интерфейс, так и полноценную среду разработки PowerShell ISE (Integrated Scripting Environment, встроенное скриптовое окружение) для скриптов.

Изображение Windows Power Shell ISE

Среда разработки Windows PowerShell ISE

Написание и запуск скриптов

Также существуют системные политики, ограничивающие выполнение скриптов. Можно проверить текущие параметры политики, введя команду Get-ExecutionPolicy . Результатом будет одно из следующих значений:

  • Restricted — выполнение скриптов запрещено. Стандартная конфигурация;
  • AllSigned — можно запускать скрипты, подписанные доверенным разработчиком; перед запуском скрипта PowerShell запросит у вас подтверждение;
  • RemoteSigned — можно запускать собственные скрипты или те, что подписаны доверенным разработчиком;
  • Unrestricted — можно запускать любые скрипты.

Для начала работы необходимо изменить настройку политики запуска на RemoteSigned, используя команду Set-ExecutionPolicy :

После выполнения команды можно будет запускать свои скрипты

Командлеты

Командлеты — это команды с предопределённой функцией, подобные условным операторам в языках программирования. У них есть несколько ключевых особенностей:

  • существуют системные, пользовательские и опциональные командлеты;
  • результатом выполнения командлета будет объект или массив объектов;
  • командлеты могут обрабатывать данные и передавать их другим командлетам с помощью конвейеров;
  • командлеты нечувствительны к регистру, так что нет никакой разницы между Get-ADUser , get-aduser и gEt-AdUsEr ;
  • в качестве разделителя используется символ ; .

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

  • Get-Process — отобразить текущие процессы, запущенные на компьютере;
  • Get-Service — отобразить список служб и их статус;
  • Get-Content — отобразить содержимое указанного файла, например Get-Content C:\Windows\System32\drivers\etc\hosts .

При необходимости список всех доступных командлетов можно вывести с помощью Get-Help-Category. Запомните эту команду — она крайне важна для тех, кто изучает PowerShell с нуля, так как помогает быстрее начать ориентироваться в его возможностях.

Команда Get-Help-Category в PowerShell

Результат выполнения команды Get-Help-Category

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

Параметры

У каждого командлета есть несколько параметров, определяющих его работу. PowerShell ISE автоматически предлагает все доступные параметры с отображением их типа. Например, Get-Service-NameW* выводит список служб, у которых имя начинается с W . Если вы забыли, какие параметры у введённого командлета, воспользуйтесь Get-Member .

Читайте также: