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


Альтернативный способ получения содержимого файла

Альтернативный способ получения содержимого файла

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

Get-Content C:\Files\file.txt

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

${C:\Files\file.txt}

Конечно всегда полезно узнать что-то новое, но привел я этот способ вовсе не для общего развития. Дело в том, что при его использовании чтение файла осуществляется гораздо быстрее, при этом потребляя меньше ресурсов. Для наглядности проведем небольшой эксперимент — возьмем файл и считаем его в переменную двумя разными способами, при этом замерив время работы и потребление памяти. Для измерения времени выполнения команды используем командлет Measure-Command.

Сначала замерим исходные данные. Размер файла составляет 65Мб, потребление памяти процессом PowerShell в простое около 66 Мб.

 

Затем считаем содержимое файла в переменную с помощью Get-Content и измерим время работы командой:

Measure-Command -Expression {$a = Get-Content ″C:\Files\file.txt″}

Команда отработала за 5,5 секунд, потребление памяти составило 1079784Кб (≈1Гб).

 

Теперь выполним чтение файла альтернативным способом, командой:

Measure-Command -Expression {$a = ${C:\files\file.txt}}

В этом случае для работы команды потребовалось всего 0,3 секунды и 233508Кб (≈233,5Мб) памяти.

 

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

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

${C:\files\*.txt}

или так:

${%systemdrive%\files\file.txt}

Т.е. этот способ не позволяет считать сразу несколько файлов, в отличие от Get-Content.

windowsnotes.ru

Операции с файлами с помощью PowerShell и WMI

Инструментарий управления Windows (Windows Management Instrumentation, WMI) — одна из базовых технологий для мониторинга и управления компьютерами на базе операционных систем Windows. WMI является открытой унифицированной системой интерфейсов доступа ко всем параметрам операционной системы, а также к устройствам и приложениям, работающим в ней.

В числе прочего WMI предоставляет доступ к файловой системе и позволяет производить некоторые действия с файлами и папками. Создавать файлы\папки с помощью WMI нельзя, но можно копировать, удалять и переименовывать файлы. Сегодня мы немного поиздеваемся 🙂 над файлами с помощью WMI и PowerShell.

Примечание. В основе WMI лежит открытая информационная модель (Common Information Model, CIM). Поэтому в Windows существует два типа классов WMI — Win32 и CIM. Так например для работы с файлами очень удобно использовать класс CIM_DataFile, а для работы с директориями класс Win32_Directory.

Также в PowerShell есть два типа командлетов для WMI — традиционные WMI-командлеты и CIM-командлеты, появившиеся в PowerShell 3.0.  Основное их различие в способе удаленного взаимодействия: командлеты WMI используют DCOM, тогда как CIM-командлеты WS-Management. В остальном они работают одинаково, например команды Get-WmiObject и Get-CimInstance выведут практически одно и то же.

Поиск файлов

Найти нужные файлы можно с помощью командлета Get-CimInstance. Для примера выведем список текстовых файлов, находящихся в директории C:\Files, командой:

Get-CimInstance -ClassName CIM_DataFile -Filter ″Drive=′C:′ and Path=′\\Files\\′ and Extension=′txt′″

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

 

Как вариант, для поиска можно использовать запросы на языке WQL (WMI Query Language). Следующей командой выведем файлы, находящиеся в директории C:\Files и имеющие в своем имени obj:

Get-CimInstance -Query ″SELECT * FROM CIM_Datafile WHERE Drive=′C:′ AND Path=′\\Files\\′ AND Name LIKE ′%obj%′″  | select Name,Version

 

Для понимания того, по каким критериям можно производить поиск, возьмем произвольный файл и выведем его свойства:

$file = Get-CimInstance -ClassName CIM_Datafile -Filter ″Name=′C:\\Files\\user.txt′″$file | Get-Member -MemberType Properties

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

 

В качестве примера возьмем дату последнего изменения (LastModified) и найдем все файлы в директории C:\Files, у которых эта дата старше 6 месяцев:

$Date = (Get-Date).addMonth(-6)$query = ″SELECT * FROM CIM_DataFile WHERE Drive=′C:′ AND Path=′\\Files\\′″Get-CimInstance _Query $query | where {$_.LastModified -lt $date} | select Name, LastModified

 

Примечание. Когда вы производите поиск файлов с помощью Get-ChildItem, то у вас есть возможность указать ключ Recurce для рекурсивного поиска по всем поддиректориям. В отличие от него Get-CimInstance ищет только в указанном расположении. WMI не имеет встроенной рекурсии, поэтому поиск по поддиректориям необходимо реализовывать собственными силами.

Удаление файлов

Все основные операции с файлами производятся с помощью командлета Invoke-CimMethod. Например, для удаления одного файла user.txt можно воспользоваться такой командой:

Get-CimInstance -ClassName CIM_Datafile -Filter ″Name=′C:\\Files\\user.txt′″ | Invoke-CimMethod -MethodName Delete

А удалить из папки все файлы, имеющие в имени user можно так:

$Query = ″SELECT * FROM CIM_Datafile WHERE Drive=′C:′ AND Path=′\\Files\\′ AND Name LIKE ′%user%′″Invoke-CimMethod -Query $query -MethodName Delete

Переименование файлов

Переименование производится с помощью метода Rename. Например, переименовать один файл можно таким образом:

$query = ″SELECT * FROM CIM_Datafile WHERE Name=′C:\\Files\\error.txt′″$NewName = ′C:\Files\OldError.txt′Invoke-CimMethod -Query $query -MethodName Rename -Arguments @{FileName=$NewName}

 

Один файл переименовать достаточно просто, поэтому возьмем более сложный случай. Например, требуется переименовать группу файлов, заменив в имени файла img на pic. Делаем так:

$query = ″SELECT * FROM CIM_Datafile WHERE Drive=′C:′ AND Path=′\\Files\\′ AND Name LIKE ′%img%′″$files = Get-CimInstance -Query $queryforeach ($file in $files) {$name=$file.name -replace ′img′,′pic′; Invoke-CimMethod -InputObject $file -MethodName Rename -Arguments @{FileName=$name}}

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

Процедура копирования очень похожа на переименование. Например, скопируем файл pic.png  из директории C:\Files в C:\Temp такой командой:

Invoke-CimMethod -MethodName Copy -Query ″SELECT * FROM CIM_DataFile WHERE Name=′C:\\Files\\pic.png′″ -Arguments @{FileName=″C:\\Temp\\pic.png″}

 

А для копирования из C:\Files в C:\Temp всех файлов с именем pic воспользуемся следующей конструкцией:

$query = ″SELECT * FROM CIM_Datafile WHERE Drive=′C:′ AND Path=′\\Files\\′ AND Name LIKE ′%pic%′″$files = Get-CimInstance -Query $queryforeach ($file in $files) {$name=″C:\Temp\$($file.FileName).$(Sfile.Extension)″; Invoke-CimMethod -InputObject $file -MethodName Copy -Arguments @{FileName=$name}}

 

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

windowsnotes.ru

Как в PowerShell считать файл одной строкой

Как в PowerShell считать файл одной строкой

При работе с текстовыми файлами в PowerShell есть некоторые особенности. Например, если считать текстовый файл с помощью командлета Get-Content, то его содержимое будет возвращено в виде массива строк, разделенных символом новой строки.

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

$a = Get-Content C:\files\file.txt

Как видите, переменная имеет тип данных Object[], т.е. массив.

 

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

Проще всего воспользоваться командлетом Get-Content с параметром Raw. Он игнорирует все символы новой строки и выводит содержимое файла в одну строку. Например:

$b = Get-Content C:\files\file.txt -Raw

 

Обратите внимание, что параметр Raw появился в третьей версии PowerShell. Если вдруг у вас более ранняя версия, то можно воспользоваться статическим методом ReadAllText класса File:

$c = [System.IO.File]::ReadAllText(″C:\files\file.txt″)

 

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

$d = Get-Content C:\files\file.txt | Out-String

 

В принципе неважно, каким из этих методов воспользоваться, в результате все равно получаем строку.

windowsnotes.ru

Работа с объектами в PowerShell

Продолжая тему объектов в PowerShell обратимся к практической стороне вопроса и рассмотрим свойства и методы реальных объектов.  В качестве подопытного возьмем самую обычную папку с файлами, находящуюся по адресу c:\pstest.

Командой  Get-ChildItem (или Dir) выведем ее содержимое и результат поместим в переменную:

$list=Get-Childitem c:\pstest

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

Поскольку на выходе несколько объектов, PowerShell поместит их в массив. Можно обращаться к элементам массива по их порядковым номерам, например:

$object=$list[1]

 

В переменной $object у нас находится папка test2.test. С ней и будем работать дальше. Для просмотра всех ее свойств воспользуемся командлетом Get-Member :

$object | Get-Member -memberType *property

 

Свойства, полученные при создании объекта называются просто «Property». Свойства, добавленные PowerShell пишутся с префиксом PS (напр. PSChildName) и именуются «ScriptProperty» или «NoteProperty». Свойства NoteProperty  содержат статические данные, а ScriptProperty  исполняемый код PowerShell.

Из свойств объекта можно узнать много полезной информации, например имя (Name) и путь (FullName) к папке, время создания (CreationTime)  и изменения (LastWriteTime) и многое другое. Посмотрим время последнего обращения к папке

$object.LastAccessTime

Если свойство объекта обозначено как {get;set;}, то мы можем его не только посмотреть, но и изменить. Зададим время последнего обращения текущей датой:

$object.LastAccessTime=Get-Date

Или будущей:

$object.LastAccessTime=Get-Date(“01.01.2014”)

 

А теперь возьмем свойство Name (имя объекта) и немного над ним «поиздеваемся».

Сначала получим все свойства и методы свойства Name объекта: $object.name | Get-Member

Воспользуемся ими.

Проверим, есть ли в имени объекта цифра 2 : $object.name.contains(‘2’)

Заменим 2 на 4 : $object.name.replace(‘2′,’4’)

и переведем все символы имени в верхний регистр : $object.name.toupper()

 

А теперь плавно перейдем от свойста объекта к  его методам.

$object | Get-Member -MemberType *Method

 

Наш объект является директорией. Посмотрим, содержит ли он поддиректории:

$object.getdirectories()

С помощью метода CreateSubdirectory создадим поддиректорию с именем New directory:

$object.CreateSubdirectory(‘New directory’)

А теперь создадим еще одну поддиректорию и сохраним результат в переменной:

$subdirectory=$object.CreateSubdirectory (‘Enother directory’)

Теперь мы можем обращаться к ее свойствам и изменять их, например:

$subdirectory.CreationTime= «January 1, 2014»

 

Посмотрим, как изменился наш объект. Как видим, обе созданные нами поддиректории появились. Что еще мы можем сделать с объектом? Многое, например задать разрешения доступа — $object.SetAccesssControl(), переместить — $object.MoveTo() или вообще удалить —  $object.Delete().

Вот так мы узнали как управлять свойствами и методами объектов. А используя свойства и методы объекта мы можем  управлять и самим объектом. Поэтому рекомендую почаще пользоваться командлетом Get-Member при работе с PowerShell.

windowsnotes.ru

Работа с файлами и папками

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

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

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

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

Get-ChildItem -Force C:\ -Recurse

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

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

Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe | Where-Object -FilterScript {($_.LastWriteTime -gt "2005-10-01") -and ($_.Length -ge 1m) -and ($_.Length -le 10m)}

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

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

Copy-Item -Path c:\boot.ini -Destination c:\boot.bak

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

Copy-Item -Path c:\boot.ini -Destination c:\boot.bak -Force

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

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

Copy-Item C:\temp\test1 -Recurse c:\temp\DeleteMe

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

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination c:\temp\text

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

(New-Object -ComObject Scripting.FileSystemObject).CopyFile("c:\boot.ini", "c:\boot.bak")

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

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

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

New-Item -Path 'C:\temp\New Folder' -ItemType "directory"

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

New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType "file"

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

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

Remove-Item C:\temp\DeleteMe Confirm The item at C:\temp\DeleteMe has children and the -recurse parameter was not specified. If you continue, all children will be removed with the item. Are you sure you want to continue? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):

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

Remove-Item C:\temp\DeleteMe -Recurse

Отображение локальной папки в виде диска, доступного в Windows

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

subst p: $env:programfiles

Как и в случае сетевых дисков, диски, отображенные в оболочке Windows PowerShell при помощи команды subst, немедленно становятся доступными оболочке Windows PowerShell.

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

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

PS> Get-Content -Path C:\boot.ini [boot loader] timeout=5 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=AlwaysOff /fastdetect multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=" Microsoft Windows XP Professional with Data Execution Prevention" /noexecute=optin /fastdetect

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

PS> (Get-Content -Path C:\boot.ini).Length 6

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

$Computers = Get-Content -Path C:\temp\DomainMembers.txt

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

winintro.ru

Обзор возможностей Windows PowerShell

  • Запуск среды Windows PowerShell осуществляется следующим образом Пуск (Start) ->Все Программы (All Programms)   и   выбрать   элемент   Windows   PowerShell. Другой вариант запуска оболочки - пункт Выполнить... (Run) в меню Пуск (Start), ввести имя файла powershell и нажать кнопку ОК.
  • Выполним первую команду в PowerShell. Для первого знакомства с Windows PowerShell вполне подойдет команда help. Внимательно изучите выведенную на экран информацию.
  • Исполните из командной строки:PS C:> Help Get-Command
  • В результате выполнения этой команды мы получим полное описание команды Get-Command, включая ее назначение, синтаксис, опции и т.п.

  • Выполните команду:PS C:> Get-Command
  • На экран будет выведен список всех встроенных команд.

  • Просмотрите список всех сервисов, запущенных на вашем компьютере, исполнив команду:
  • PS C:> Get-Service

    Команда Get-Service служит для получения списка всех сервисов, запущенных на данном компьютере.

  • Просмотрите  список  всех  процессов,  запущенных  в настоящий  момент  на вашем  компьютере,  исполнив команду:
  • PS C:> Get-Process

  • Для получения информации только об одном процессе в качестве аргумента команды Get-Process задается имя этого процесса. Выполните команду:
  • PS C:> Get-Process explorer

  • Из командной строки исполните команду:
  • PS C:> Get-Process w*

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

    По умолчанию информация выводится в виде таблицы, но на самом деле все команды возвращают объекты. Эти объекты могут быть переданы на вход другим командам с помощью символа «|»

  • Исполните команду:
  • PS C:> Get-Process i* | format-list

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

    PS C:> Help format*

    Другие возможные форматы:

    PS C:> Get-Process i* | format-wide

    и

    PS C:> Get-Process i* | format-custom

    Выполняя команды, мы всегда получаем объекты, а у объектов

    есть свойства. Просмотрите все свойства объекта, полученного

    при   выполнении   команды   Get-Process   используя   следующую команду:

    PS C:> Get-Process | Get-Member

  • Поскольку на выходе всегда получается объект, можно манипулировать им для выполнения дополнительных операций. Выполните операцию фильтрации, исполнив команду:
  • PS C:> Get-Process | where {$_.handlecount -gt 400}

  • Выполните операцию сортировки, исполнив команду:
  • PS C:> Get-Process | where {$_.handlecount -gt 400} | sort-object Handles

  • Выполним     команду     Get-Process|Get-Member
  • Company   —   при   форматировании   по   умолчанию невозможно получить желаемые данные. Преобразуем полученную команду в:

    PS C:> Get-Process | Get-Member Company | Format-List

    PS C:> Get-Process | sort-object Company | format-table -Group Company name, description, handles.

  • Произведем сортировку объектов по свойству WS (working set) и выбор 5 процессов, занимающих больше всего памяти
  • PS C:> Get-Process | sort-object -property WS –descending| select-object -first 5

    Команда stop-process позволяет остановить запущенный процесс.

    Запустите Notepad на виртуальной машине. Выполните команду:

    PS С:> Get-process notepad | stop-process

    Окно Блокнота закроется. Снова запустите Notepad.

    Такая возможность не всегда является безопасной, поэтому лучше использовать подобные команды с опцией whatif, которая показывает, что произойдет при выполнении той или иной команды, но на самом деле команда не выполняется:

    PS C:> Get-Process notepad | stop-process -whatif

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

    PS C:> Get-Process notepad | stop-process -confirm

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

    Помимо этого можно создавать собственные пакетные файлы, представляющие собой файлы с расширением *.psl, в которые помещаются команды PowerShell, и выполнять их. Для соблюдения безопасности пакетные файлы должны быть подписаны. Для защиты пользовательских данных и целостности операционной системы в оболочке Windows PowerShell реализованы некоторые средства обеспечения безопасности, в том числе политика выполнения. Политика выполнения определяет, можно ли выполнять сценарии, и если да, должны ли они быть подписаны цифровой подписью. Кроме того, она определяет, можно ли загружать конфигурационные файлы.

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

    PS C:> get-executionpolicy

    В случае установки по умолчанию вы должны получить статус Restricted. Для того чтобы сменить этот статус, воспользуйтесь командой:

    PS C:> set-executionpolicy <статус_политики>

    Рассмотрим, какие статусы политики выполнения возможны:

    Restricted - эта политика выполнения по умолчанию. Допускает отдельные команды, но сценарии выполнять нельзя.

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

    RemoteSigned - при таком статусе политики выполнение сценариев также разрешено. Необходимо наличие цифровой подписи надежного издателя на всех сценариях и файлах конфигураций, загруженных из Интернета (включая электронную почту и программы мгновенного обмена сообщениями). Нет необходимости в цифровых подписях на сценариях, запускаемых с локального компьютера. Не запрашивают подтверждения перед выполнением сценариев надежных издателей. Подписанные, но вредоносные сценарии также выполняются.

    Unrestricted - самая демократичная политика, позволяет запускать неподписанные сценарии. Сценарии и файлы конфигурации, загруженные из Интернета (включая Microsoft Outlook, Outlook Express и Windows Messenger), выполняются после предупреждения, что данный файл был загружен из Интернета. Как и следовало ожидать, при таком статусе также возможно выполнение вредоносных сценариев. Думаю, использование данного статуса политики выполнения возможно только на тестовых машинах, так как в реальных сетях это крайне небезопасно.

    В зависимости от специфики выполняемых серверами задач рекомендуется использовать RemoteSigned, в случаях, когда выполняются преимущественно сценарии собственного написания, и AllSigned, когда выполняются сценарии, полученные из внешних источников. Для нашего упражнения устанавливаем статус политики Unrestricted либо RemoteSigned:

    PS C:> Set-ExecutionPolicy Unrestricted

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

    PS C:> Set-ExecutionPolicy AllSigned

    Для запуска скриптов psl достаточно просто набрать в командной строке PowerShell имя файла.

    orlova.rsue.ru

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

    Windows PowerShell использует существительное Item для обращения к элементам, расположенным на диске Windows PowerShell. При работе с поставщиком Windows PowerShell FileSystem Item может представлять файл, папку или диск Windows PowerShell. Вывод и работа этих элементов является важной основной задачей в большинстве административных настроек, поэтому следует подробнее остановиться на этих задачах.

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

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

    PS> Get-ChildItem -Path C:\Windows Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2006-05-16 8:10 AM 0 0.log -a--- 2005-11-29 3:16 PM 97 acc1.txt -a--- 2005-10-23 11:21 PM 3848 actsetup.log ...

    Вывод выглядит аналогично тому, что можно увидеть, выполнив команду dir в оболочке Cmd.exe или команду ls в командной оболочке UNIX.

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

    PS> Get-Command -Name Get-ChildItem -Syntax

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

    Вывод всех вложенных элементов (параметр -Recurse)

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

    PS> Get-ChildItem -Path C:\WINDOWS -Recurse Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\WINDOWS Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\WINDOWS\AppPatch Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2004-08-04 8:00 AM 1852416 AcGenral.dll ...
    Фильтрация элементов по имени (параметр -Name)

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

    PS> Get-ChildItem -Path C:\WINDOWS -Name addins AppPatch assembly ...
    Принудительный показ скрытых элементов (параметр -Force)

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

    Get-ChildItem -Path C:\Windows -Force

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

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

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

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

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

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

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

    PS> Get-ChildItem -Path C:\Windows\?????.log Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows Mode LastWriteTime Length Name ---- ------------- ------ ---- ... -a--- 2006-05-11 6:31 PM 204276 ocgen.log -a--- 2006-05-11 6:31 PM 22365 ocmsn.log ... -a--- 2005-11-11 4:55 AM 64 setup.log -a--- 2005-12-15 2:24 PM 17719 VxSDM.log ...

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

    Get-ChildItem -Path C:\Windows\x*

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

    Get-ChildItem -Path C:\Windows\[xz]*
    Исключение элементов (параметр -Exclude)

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

    Предположим, например, что необходимо найти файл динамической библиотеки Windows Time Service в папке "System32", причем известно лишь, что имя файла начинается с буквы "W" и содержит строку "32".

    Выражение вида w*32*.dll найдет все файлы DLL, которые удовлетворяют условиям, но оно также может вывести совместимые с Windows 95 и 16-разрядной системой Windows файлы DLL, которые содержат в именах сочетания символов "95" или "16". Можно исключить файлы, содержащие в имени такие числа с помощью параметра Exclude с шаблоном *[9516]*::

    PS> Get-ChildItem -Path C:\WINDOWS\System32\w*32*.dll -Exclude *[9516]*

    Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS\System32

    Mode LastWriteTime Length Name

    ---- ------------- ------ ----

    -a--- 2004-08-04 8:00 AM 174592 w32time.dll

    -a--- 2004-08-04 8:00 AM 22016 w32topl.dll

    -a--- 2004-08-04 8:00 AM 101888 win32spl.dll

    -a--- 2004-08-04 8:00 AM 172032 wldap32.dll

    -a--- 2004-08-04 8:00 AM 264192 wow32.dll

    -a--- 2004-08-04 8:00 AM 82944 ws2_32.dll

    -a--- 2004-08-04 8:00 AM 42496 wsnmp32.dll

    -a--- 2004-08-04 8:00 AM 22528 wsock32.dll

    -a--- 2004-08-04 8:00 AM 18432 wtsapi32.dll

    Использование нескольких параметров Get-ChildItem

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

    PS> Get-ChildItem -Path C:\Windows\*.dll -Recurse -Exclude [a-y]*.dll

    Результаты отсутствуют несмотря на то, что в папке "Windows" имеется два файла DLL, которые начинаются с буквы "z".

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

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

    PS> Get-ChildItem -Path C:\Windows -Include *.dll -Recurse -Exclude [a-y]*.dll Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows\System32\Setup Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2004-08-04 8:00 AM 8261 zoneoc.dll Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows\System32 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2004-08-04 8:00 AM 337920 zipfldr.dll

    winintro.ru