Разное

Powershell сравнение файлов: Как сравнить два файла по содержимому в Windows — Сеть без проблем

18.01.1999

Содержание

списков — powershell сравнение файлов

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

Например, это выражение:

$firstFolder | Get-Member

будет возвращать информацию о типе System.IO.DirectoryInfo , который действительно является типом первого элемента в массиве $firstFolder . Если вы хотите работать с самим объектом массива, вы должны явно указать PowerShell для обработки объекта как массива с помощью оператора. Следующее выражение:

,$firstFolder | Get-Member

будет возвращать информацию об System.Object[] .

Однако, когда оператор -eq используется между двумя переменными массива, все немного отличается. На самом деле PowerShell перечисляет только массив с левой стороны и сравнивает каждый элемент с массивом с правой стороны в целом .

Результатом будет массив совпадающих элементов или вообще ничего, если совпадений нет. Например:

$a = 1..5
$b = 1..5
$a -eq $b         # returns zero-length array
[bool]($a -eq $b) # returns $false
$a -eq 3          # returns 3

В вашем конкретном случае результатом будет массив с нулевой длиной (или $false если он был добавлен в логическое значение ), поскольку массив $firstFolder содержит объекты System.IO.DirectoryInfo, которые не вполне соответствуют массиву переменной

$secondFolder .

Вы действительно хотите сравнить содержимое обоих массивов друг с другом. Здесь удобно использовать командлет Compare-Object :

Compare-Object $firstFolder $secondFolder -SyncWindow 0

Это вернет массив различий между двумя массивами или $null если массивы равны. Точнее, результирующий массив будет содержать объект для каждого элемента, который существует только в одном массиве, а не в другом. -SyncWindow 0 будет делать порядок, в котором элементы отображаются в -SyncWindow 0

в качестве разницы.

Если вам нужно всего лишь простой способ определить, являются ли эти два массива разными, не вдаваясь в детали того, что отличается, вы можете просто проверить длину массива, возвращаемого Compare-Object :

$areEqual = @(Compare-Object $firstFolder $secondFolder -SyncWindow 0).Length -eq 0

Обратите внимание на то, что я в явном виде сказал PowerShell всегда упаковывать результаты в массив, поскольку Compare-Object может возвращать $null когда массивы не содержат различий.

Использование PowerShell сравнить локальный текстовый файл с помощью текстового файла в Интернете одинаковы

Сравнительный локальный текстовый файл , такой же , как правило , используется два способами PowerShell: 1 по Get-FileHash этой команды, хэш сравнить два файла является одинаковым; 2 по. Сравнениям-объекта команда, сравнить два файла в строку. Они одинаковы.

Сравнить локальные текстовые файлы и текстовые файлы на веб — это те же два вида идей, но в первую очередь иметь дело с файлами в Интернете. Обработка веб — документа также четко два подхода: 1 , чтобы передать содержание веб — документа (. Командлет Invoke-WebRequest ), по сравнению непосредственно в памяти; 2 содержание сети , чтобы получить файл, а затем сохраните файл локально, файл преобразуется в локальное. сравнение между ними. Этот метод требует только после получения содержимого веб — документов, плюс операции записи шаг файла ( New-Item , надстроек Content ) может быть, ничего не сказать, что эта статья в основном о первом сравнении двух способов способов для того, чтобы легко определить правильность программы, содержимое двух документов , то же самое здесь.

1. Сравнение двух хеш-файлы одинаковы

1   # Получить локальный хэш файла ( с помощью MD5) 
2   $ пути = " C: \ local.txt " 
. 3   $ hashLocal = Get-FileHash -Path $ пути - Алгоритм MD5
 . 4   от записи Выход $ hashLocal 
. 5  
. 6   $ URL = " XXX " 
7   # набор" -ExpandProperty « , чтобы полностью вернуть содержание текста 
8   $ cotent = ВЫЗОВ-WebRequest -uri $ URL | ВЫБОР - содержание ExpandProperty
 9   # в массив символов, положить в MemoryStream 
10   $ charArray = $ cotent.ToCharArray ()
 . 11   $ Поток = [System.IO.MemoryStream] :: новый новый ( $ charArray )
 12   # Get-FileHash хэш также быть получен путем потока 
13 составляет   $ hashWeb = Get-FileHash 
-InputStream ( $ Поток )
- Алгоритм MD5 - 14 # примечание от MemoryStream 15 $ поток .close () 16 от записи Выхода $ hashWeb . 17 18 $ hashLocal .hash -eq $ hashWeb .hash

2. Линия содержания по сравнению линии двух документов одинаковы

1  $ Путь = " C: \ local.txt " 
2  $ URL = " XXX " 
3  $ contentLocal = Get-Content $ путь 
4  $ cotentWeb = Invoke-WebRequest -uri $ URL | выберите - ExpandProperty содержании
 5  $ диф = Compare-Object -ReferenceObject $ ( $ contentLocal ) -DifferenceObject $ ( $ cotentWeb )
 6  если ( $ Diff ) {
 7      Write-Output " ! Содержание не то же самое " 
8 }

Выполнить данные неверны, отладка находки  Get-Content( cat) типа возвращаемого значения System.Array , а Invoke-WebRequest тип возвращаемого значения String

1 PS C: \> $ item1 .GetType ()
 2  
3  IsPublic IsSerial Имя BaseType
 4 -------- -------- ---- --------
 5  Правда      Правда      Object []                                  System.Array
 6  
7 PS C: \> $ элемент2 .GetType ()
 8  
9  IsPublic IsSerial Имя BaseType
 10 -------- -------- ---- ---- ----
 11  Правда      Правда      
Строка
System.Object

 Необходимо Invoke-WebRequest возвращать значение типа переустройства

путь $ = " C: \ local.txt " 
$ URL = " XXX " 
$ contentLocal = Get-Content $ путь 
$ cotentWeb = ВЫЗОВ-WebRequest -uri $ URL | ВЫБОР - ExpandProperty Content
 # с использованием регулярных выражений «\ г \? Эффект п «новой строки устранить разницу 
$ cotentWebArray = $ cotentWeb -Сплит '\ R & л? \ n-'
 $ разн = сравнения-Object -ReferenceObject $ ( $ contentLocal ) -DifferenceObject $ ( $ cotentWebArray )
 IF ( $ разн ) { 
    от записи - Вывод "Содержание не то же самое! " 
}

Получение содержимого файла в Powershell с Get-Content на примерах

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

 

Для открытия файла ‘C:\text.txt’ можно использовать следующую команду:


Get-Content -Path 'C:\Windows\System32\drivers\etc\hosts'

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

  • ‘*’ — говорит об неизвестном количестве символов;
  • [a,b] — говорит, что в этом месте может быть буква ‘a’ или ‘b’;
  • ? — обозначает один неизвестный символ.

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

В этом примере я открою сразу два файла: lmhosts и hosts:


Get-Content -Path 'C:\Windows\System32\drivers\etc\*st*'

Следующие примеры вернут аналогичный результат:


Get-Content -Path 'C:\Windows\System32\drivers\etc\[l,h]*ost*'
Get-Content -Path 'C:\Windows\System32\drivers\etc\*h?st*'

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

  • Include — в этом параметре мы добавляем шаблон, по которому будем включать файл;
  • Exclude — с помощью этого параметра исключает файлы;
  • Filter — исключает результаты.

Для каждого из этих параметров есть обязательно условие — использовать знак ‘*’ в конце пути.

Так мы вернем все файлы с расширением ‘.txt’:


Get-Content -Path 'C:\*' -Filter '*.txt'

В отличие от Filter, в Include и Exclude мы можем использовать несколько значений. В этом примере мы откроем файлы формата ‘.txt’ и ‘.ini’:


Get-Content -Path 'C:\*' -Include '*.txt','*.ini'

Полное и построчное чтение с поиском

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


Get-Content -Path 'C:\file*.txt' | Select-String -Pattern 'Line 8'

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

Get-Content -Path 'C:\file*.txt' -Raw | Select-String -Pattern 'Line 8'

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


Get-Content -Path 'C:\file*.txt' -ReadCount 2 | Select-String -Pattern 'Line 8'

Разделение файла

Файл выводится построчно из-за делиметра (разделителя), который по умолчанию равен ‘\n’ (идентификатор новой строки). Мы можем разделить файл иначе, например, использовав точку с запятой:


Get-Content -Path 'C:\delimiter.txt' -Delimiter ';'

То есть результат выше — это массив. В массивах Powershell мы можем получать содержимое по индексам. В следующем примере я просто уберу точку с запятой:


$content = Get-Content -Path 'C:\delimiter.txt' -Delimiter ';'
# Выведем первый элемент
$content[0]
# Уберем разделитель во всех адресах
foreach ($c in $content){
    $c -replace ';',''
}

Подсчет количества строк

Построчный вывод с командой Powershell позволяет посчитать количество строк во всем файле. Для подсчета используется команда Measure-Object:


Get-Content -Path 'C:\file.txt' | measure

Если нужна только цифра, а не объект, можно сделать так:


(Get-Content -Path 'C:\file.txt' | measure).Count

Кодировки

В параметре -Encoding можно указать следующие кодировки:

  • ASCII
  • BigEndianUnicode
  • BigEndianUTF32
  • Byte
  • Default
  • OEM
  • Unicode
  • UTF7
  • UTF8
  • UTF32

 

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

  • Access to the path is denied
  • The FileSystem provider supports credentials only on the New-PSDrive cmdlet. Perform the operation again withoutspecifying credentials.

Для обхода этих ошибок, если у вас нет другого выхода, нужно использовать Invoke-Command (команда удаленного подключения). Для ее настройки могут потребоваться дополнительные настройки описанные в другой статье.

Сам процесс открытия файла под другим пользователем будет выглядеть так:


# Вводим свои учетные данные
$creds = Get-Credential
# Выполняем запрос под другим пользователем
Invoke-Command -Computer localhost -Credential $creds -ScriptBlock {Get-Content -Path 'C:\Folder\File2.txt'}

 

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


Get-Content -Path 'C:\file1.txt' -Wait

 

Можно ограничить вывод содержимого файла указав количество нужных строк в начале или конце:

  • Head — выведет указанное количество строк с начала;
  • Tail — выведет указанное количество строк с конца.

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


Get-Content -Path 'C:\file1.txt' -Head 5

 

Get-Content не позволяет искать и открывать фалы  находящиеся внутри других каталогов. Такой поиск называется рекурсивным и он доступен в Get-ChildItem.

В следующем примере мы вернем файлы из всех каталогов и подкаталогов:


Get-ChildItem -Path 'C:\Windows\' -Recurse -File

File — возвращает только файлы. Каталоги нам не нужны.

С Get-ChildItem вы так же можете использовать Include,Exclude и Filter, которые были рассмотрены раннее. Использовать эти ключи лучше всего в первой команде т.к. это будет работать быстрее.

Через конвейер мы сможем открыть каждый файл, а с Select-Sting проверить есть ли в нем нужный текст. Так мы найдем файл с Powershell, который содержит строку ‘127.0.0.1’ в папке Windows:


Get-ChildItem -Path 'C:\Windows\System32\drivers\etc\' -Recurse -File |
Get-Content -Raw |
Select-String '127.0.0.1'

Если убрать параметр Raw, то у нас выведется только та строка, которую мы искали:

 

Вы так же можете изменить содержимое файла и перезаписать этот файл. Представим, что вам нужно заменить адрес ‘127.0.0.1’ в строке — это можно сделать так:


'My address: 127.0.0.1/24' -replace '127.0.0.1','192.168.3.2'

 

Или с помощью регулярного выражения (не точный шаблон):


'My address: 127.0.0.1/24' -replace '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}','192.168.3.2'

Для записи в файл у нас есть два варианта. Первый — это использовать перенаправление в виде знака ‘>’, который перезапишет все содержимое файла или создаст новый файл:


$file_content = Get-Content -Path 'C:\file1.txt'
$file_content -replace '127.0.0.1','192.168.3.2' > file1.txt

Второй вариант — использовать команду Set-Content:


$file_content = Get-Content -Path 'C:\file1.txt'
$file_content -replace '127.0.0.1','192.168.3.2' | Set-Content -Path 'C:\file1.txt'

 

У меня есть файл ‘file.txt’ со следующим содержанием:


some text 123 some text 6 some
text 9 some text 312345
123.2

Шаблон регулярного выражения  ‘\d*\.?\d*’ говорит, что мы ищем число, после которого может быть точка, после которого могут быть еще числа. Таким образом мы захватим целые и числа с плавающей точкой. 

Для выделения таких чисел из строк нужно использовать Select-String:


$file = Get-Content -Path 'file.txt'
$result = Select-String -InputObject $file -Pattern '\d*\.?\d*' -AllMatches | Foreach {$_.matches}

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


$result | where Value -ne '' | select Value

Мы можем вернуть остаток от деления использовав %. Если число делится на 2 с остатком 0, то оно будет четным:


# Открываем файл
$opened_file = Get-Content -Path 'file.txt'
# Поиск чисел
$result = Select-String -InputObject $opened_file -Pattern '\d*\.?\d*' -AllMatches | Foreach {$_.matches}
# Исключение пустых строк в выводе
$result = ($result | where Value -ne '').Value
foreach ($num in $result){
   # Результат деления
   $n = $num%2
   if ($n -eq 0){Write-Output "Число четное: $num"}
   else {Write-Output "Число не четное: $num"}
}

 

Теги: #powershell #файлы

Сравнение Windows PowerShell и командной строки »WebNots

Начиная с Windows 7 и заканчивая Windows 10, Microsoft предоставляла опции командной строки Windows и Windows PowerShell. Это два интерфейса командной строки, которые помогают пользователям напрямую взаимодействовать с операционной системой. Вы можете использовать большинство команд DOS в интерфейсе командной строки.

Связанный: 10 команд командной строки Windows, которые вы должны знать.

Windows PowerShell против командной строки

Наличие этих двух командных оболочек может сбивать с толку большинство пользователей Windows. Интересно, что PowerShell и командная строка имеют схожий вид, и большинство их команд одинаковы. Цель этой статьи — провести четкую грань между двумя инструментами, а также обсудить, что преобладает над другим.

Командная строка против Windows PowerShell

Что такое командная строка Windows?

Командная строка Windows (или сокращенно cmd) — это командная оболочка, основанная на операционной системе MS-DOS 1980 года. Он присутствует в ОС Microsoft, начиная с Windows NT. Это просто приложение Win32, которое помогает пользователям взаимодействовать с операционной системой с помощью текстовых инструкций (команд) и параметров.

Пользователи полагаются на возможности CMD для взаимодействия со всеми другими объектами и приложениями Win32. Это помогает выполнять различные задачи в Windows, например:

  • Запускайте различные приложения и утилиты.
  • Активировать / деактивировать важные настройки Windows.
  • Создавать или изменять скрипты для автоматизации задач.
  • Диагностировать и устранять различные проблемы с ОС, например, сканирование на наличие ошибок.
Командная строка

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

  • Он не может получить доступ к большинству элементов системного администрирования Windows.
  • Среди других недостатков он не идеален для создания сложных скриптов.

Что такое Windows PowerShell?

Windows PowerShell — это и командная оболочка, и язык сценариев, обеспечивающий более глубокую интеграцию с ОС Windows. Он основан на платформе Microsoft .Net, что обеспечивает доступ к различным уже существующим инструментам и функциям. Вы можете легко создавать лучшие команды и сложные скрипты с помощью PowerShell.

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

Windows PowerShell

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

  • Удаленный доступ к файловой системе, реестру и WMI (инструментарию управления Windows).
  • Создавайте сложные сценарии с множеством условий.
  • Удаленное выполнение задач и автоматизация с помощью многоразовых скриптов.
  • Командный трубопровод среди прочего.

Доступ к командной строке и Windows PowerShell

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

  • Нажмите сочетания клавиш «Win + R», чтобы открыть окно «Выполнить». Введите CMD и нажмите Enter, чтобы открыть командную строку.
  • Введите CMD в окне поиска Windows или Cortana Search и выберите классическое приложение командной строки.
  • Щелкните правой кнопкой мыши кнопку «Пуск» и выберите «Командная строка» или «Командная строка (администратор)». Помните, что вам необходимо запускать командную строку с правами администратора, чтобы выполнять определенные действия.

Используйте один из следующих вариантов, чтобы открыть Windows PowerShell.

  • Введите powershell в поле поиска и выберите классическое приложение Windows PowerShell.
  • Нажмите «Win + R», чтобы открыть окно «Выполнить». Введите powershell и нажмите Enter.
  • Щелкните правой кнопкой мыши кнопку «Пуск» или нажмите клавиши «Win + X» и выберите вариант Windows PowerShell или Windows PowerShell (Admin).

Если щелкнуть правой кнопкой мыши кнопку «Пуск» или нажать клавиши «Win + X», Windows покажет либо командную строку, либо параметры, связанные с Windows PowerShell. Вы можете изменить настройки, чтобы выбрать, какой вариант вы хотите отображать в меню.

  • Нажмите клавиши «Win + I», чтобы открыть приложение «Настройки Windows».
  • Нажмите на опцию «Персонализация» и перейдите в раздел «Панель задач».
  • Включите или отключите параметр «Заменить командную строку на Windows PowerShell …… ..».
Заменить командную строку на PowerShell
Сравнение PowerShell и командной строки

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

  • В то время как Cmd использует команды DOS, PowerShell использует команды, известные как командлеты, которые представляют собой независимые программные объекты, которые обеспечивают доступ к основным параметрам администрирования в Windows. Эти параметры недоступны из Cmd, что означает, что пользователям необходимо перемещаться по графическому интерфейсу, чтобы получить к ним доступ.
  • Cmd — это просто система оболочки, которая ограничивает пользователей выполнять только простые и базовые сценарии для выполнения командного файла. Однако PowerShell — это и оболочка, и среда сценариев, которая поддерживает создание больших и сложных файлов для управления системой Windows.
  • Командная строка не предназначена для системного администрирования, и пользователям требуются дополнительные утилиты для расширения ее функциональности. Напротив, в Windows PowerShell есть множество командлетов, которые упрощают жизнь системным администраторам. Он позволяет выполнять широкий спектр задач и автоматизацию, включая управление пользователями и разрешениями, конфигурации безопасности, извлечение данных и администрирование Active Directory.
  • Еще одна интересная функция PowerShell, которой не хватает в Cmd, — это «Псевдонимы». Это очень важная функция, позволяющая пользователям настраивать собственные имена для различных сценариев или командлетов. PowerShell использует псевдонимы для интерпретации старых команд DOS и запуска их как командлетов PowerShell. Например, псевдоним для «cd» (DOS) — «Set-Location» (командлет).
Псевдоним в Windows PowerShell

Связанный: Что такое драйверы в Windows и как устранить проблемы с драйверами?

  • PowerShell также поддерживает каналы (аналогично переменным), которые позволяют объединять несколько командлетов и совместно использовать данные ввода-вывода с другими командлетами. Эта функция позволяет пользователям разрабатывать сложные сценарии, которые могут передавать параметры для использования в другом командлете.

Кроме того, PowerShell предоставляет другие расширенные функции, включая:

  • Windows PowerShell ISE — интерактивная среда сценариев, которая помогает в управлении сценариями PowerShell.
Интегрированная среда сценариев Windows PowerShell
  • Secure Shell (SSH) — протокол для реализации зашифрованных соединений между удаленными системами Windows.
  • Управление пакетами — инструмент для мониторинга программного обеспечения в вашей системе.
PowerShell или командная строка, что делать дальше?

Если вы полагаетесь только на Cmd для выполнения основных команд, таких как ПФС, IPCONFIG и тому подобное, это по-прежнему удобный инструмент. Для системных администраторов и опытных пользователей, которым необходимо выполнять сложные задачи или управлять удаленными системами, PowerShell — лучший выбор. Это экономит время системных администраторов, обеспечивая доступ к более глубокой автоматизации системных задач. Тем не менее, пользователям Windows рекомендуется начать знакомство с последним, особенно после того, как Microsoft сделала оболочку по умолчанию для Windows 10. Кроме того, PowerShell превосходит старый Cmd, поскольку он предоставляет все возможности Cmd и многое другое.

Основные командлеты Windows PowerShell

Основные командлеты Windows PowerShell

Тогда как многие встроенные в оболочку командлеты могут считаться ключевыми, другие созданы исключительно для передачи объектов, которые запускаются в конвейер другими командлетами. Поэтому, в названиях таких командлетов чаще всего присутствует слово «объект». В частности, в данном разделе мы рассмотрим следующие из них:

• Sort-Object

• Group-Object

• Measure-Object

• Select-Object

• Compare-Object

Некоторые из ключевых командлетов также предназначены исключительно для экспорта и импорта данных в формат текстовых файлов и из формата текстовых файлов. К ним относятся:

• Import-CSV

• Export-CSV

• Import-CliXML

• Export-CliXML

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

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

Многие командлеты Windows PowerShell, особенно те, в названии которых содержится глагол Get-, производят объекты и помещают их в конвейер:

Get-EventLog Security –newest 20

Передавая эти объекты по конвейеру другому командлету, вы можете манипулировать ими:

Get-EventLog Security –newest 20 | Sort-Object

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

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

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

Порядок, предлагаемый командлетами по умолчанию, иногда может вас не устраивать. Например, работа со списком всех остановленных сервисов может быть неудобной, если список сформирован в алфавитном порядке по названию сервиса. Командлет Sort-Object позволяет изменить порядок, в котором перечисляются объекты. Он может принимать входящие данные любого типа; вам же остается уточнить одно или несколько свойств, в соответствии с которыми будет сформирован список объектов. Например, по умолчанию объекты могут быть отсортированы в восходящем порядке, а вы, указав параметр – descending, можете изменить порядок на нисходящий. Операционная система вашего компьютера распознает указанный порядок сортировки, поэтому результаты могут немного отличаться на разных компьютерах из-за особенностей операционной системы каждого из них. Например:

Get-Service | Sort-Object status

Или, чтобы отсортировать объекты в нисходящем порядке:

Get-Service | Sort-Object status -descending

Sort – это встроенный псевдоним командлета Sort-Object, который может использоваться вместо полного имени командлета:

Get-Service | Sort status

Обратите внимание, что при написании имен свойств регистр клавиатуры не имеет значения: status, Status, и STATUS будет означать одно и то же. Также, когда Sort-Object сортирует текстовые свойства, например, процессы или сервисы, он по умолчанию делает их нечувствительными к регистру. Чтобы более подробно узнать об опциях, предлагаемых данным командлетом, запустите команду Help Sort-Object. Иногда может показаться, что Sort-Object работает слишком медленно, особенно, когда получает по конвейеру большое количество объектов сразу. Это происходит из-за того, что командлет должен дождаться всех объектов до последнего, прежде чем начать сортировку. Как только последний объект получен, командлет моментально производит отсортированные выходные данные. Вы можете указать несколько свойств, разделяя их запятой. Например, если вы хотите получить список всех сервисов, отсортированных по статусу, но чтобы при этом внутри каждого статуса сервисы были отсортированы в алфавитном порядке, запустите команду:

Get-Service | Sort status,name

Учтите, что Sort-Object оперирует реальными значениями свойств объектов, но Windows PowerShell не всегда отображает эти реальные значения свойств. Примером может быть свойство статуса сервиса. Внутри оболочки статус отображается в виде цифры, однако, гибкая печатная система Windows PowerShell автоматически переводит это число в текстовую строку. Поэтому, вместо статуса 0 или 1, вы видите статус Stopped (остановленные) или Running (запущенные) . Если внимательно присмотреться, то можно заметить, что с помощью следующей команды статус Stopped оказывается перед Running, хотя обычно бывает наоборот:

Get-Service | Sort status

Это вызвано работой командлета Sort-Object над значением этого свойства – естественно, что при сортировке он ставит сначала 0, а потом 1. Но когда оболочка отображает данные значения, 0 превращается в Stopped, а 1 – в Running.

Группировка объектов

Иногда вам может потребоваться распределение объектов по группам, чтобы работать с каждой группой отдельно. В этом поможет командлет Group-Object. Он изучает свойства заданных объектов и объединяет объекты в группы по значениям каждого свойства. Например, данная команда:

Get-Service | Group-Object status

обычно позволяет создать две группы объектов: со статусом «остановлен» и со статусом «запущен». Возможно, вы получите и другие группы статусов, в зависимости от того, в каком состоянии находятся сервисы в тот момент, когда вы запускаете программу. Командлет Group-Object обычно бывает полезным, когда свойства объектов имеют повторяющиеся значения. Например, команда Get-Service | Group-Object name будет менее полезной, так как каждый сервис имеет уникальное имя. В данном случае командлет Group-Object будет вынужден создавать отдельную группу для каждого сервиса, и каждая группа будет включать всего один объект. Преимуществом Group-Object является то, что на выходе он показывает, сколько объектов находится в каждой группе, что позволяет вам моментально сориентироваться в том, сколько сервисов остановлено, сколько процессов откликается на запросы Windows и.т.д.

Измерение объектов

Командлет Measure-Object может посчитать количество входящих объектов, а также измерить составные значения числовых свойств объектов. В качестве самого простого примера его работы вы можете просто посчитать количество объектов с помощью команды:

Get-Process | Measure-Object

Обратите внимание, что Measure-Object вбирает в себя входящие объекты, что означает, что, поступив в него, они больше не находятся в конвейере. В качестве выходных данных Measure-Object выступают какие-либо числовые значения объектов, а не процессы. Вы можете убедиться в этом, передав выходные данные командлету Get-Member:

Get-Process | Measure-Object | Get-Member

Это означает, что после обработки командлетом Measure-Object все процессы теряются, остаются лишь числовые показатели их значений. На практике Measure-Object обычно является последним командлетом в цепочке, поскольку его выходные данные вы вряд ли захотите передать куда-то еще.

Помимо простого подсчета объектов, Measure-Object может создавать составные значения для числовых свойств объектов, например, таких как виртуальная память (VM). Для этого необходимо указать одно или несколько составных значений и имя свойства, которое вы хотите измерить:

Get-Process | Measure-Object –property VM –average –sum –minimum –maximum

Результатом будет комплексное числовое значение. Другие опции Measure-Object можно найти в справочнике (Help).

Весьма распространенное явление – сокращать имена параметров при печати, например, вводить min вместо minimum. Это обычно срабатывает хорошо, однако, не забывайте, что вы вводите просто урезанное слово, а не его аббревиатуру. Например, -aver можно набрать вместо –average (средний), в то время как –avg не будет работать, хотя это распространенная аббревиатура в английском языке.

Выбор объектов и свойств

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

Выбор определенных объектов:

Вы можете использовать Select-Object использовать для выбора подмножества объектов в конвейере, применяя такие его параметры как -first, -last и –skip:

• -first – определяет количество объектов, считая с начала, которые нужно выбрать.

• -last — определяет количество объектов, считая с начала, которые нужно выбрать.

• -skip – пропускает указанное количество объектов и отображает оставшиеся.

Например, чтобы выбрать только первые 10 объектов, запустите команду:

Get-Process | Select-Object –first 10

Чтобы выбрать 10 процессов, занимающих больше всего физической памяти:

Get-Process | Sort-Object PM | Select-Object –last 10

При таком использовании командлет Select-Object выпускает те же самые объекты, что были получены им в качестве входящих данных, однако, их количество может быть меньше. Убедиться в этом можно, передав данные из Select-Object в Get-Member:

Get-Process | Select-Object –first 10 | Get-Member

Выбор определенных свойств объектов:

Select-Object может также использоваться для ограничения свойств исходящих объектов. Например, если вы работаете с процессами и хотите вывести только данные о свойствах ID, VM и PM, вы можете использовать Select-Object, чтобы отсеять все остальные свойства:

Get-Process | Select-Object name,ID,VM,PM

Однако при таком использовании вы вынуждаете Select-Object производить новый тип объектов, отличных от входящих данных. Входящие объекты забираются командлетом, но не выпускаются обратно в конвейер. В этом можно убедиться, запустив команду:

Get-Process | Select-Object name,ID,VM,PM | Get-Member

Это происходит каждый раз, когда вы уточняете список свойств с помощью Select-Object. Эта техника может также использоваться с применением параметров –first, -skip и –last, но поскольку это список свойств, а не список объектов, Select-Object будет выдавать в качестве исходящих данных видоизмененные объекты:

Get-Process | Select-Object name,ID,VM,PM –first 10 | Get-Member

Select – это псевдоним, который используется по умолчанию для командлета Select-Object, поэтому, его можно указывать вместо полного названия:

Get-Process | Select name,id –first 10

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

Select-Object может также использоваться для придания новых, пользовательских свойств объектам. Это может быть просто новое имя для существующего свойства, например, вы можете добавить свойство ComputerName объекту, который уже имеет имя MachineName. С другой стороны, пользовательские свойства могут включать в себя сложные вычисления, например, такое свойство как PercentageFreeSpace (свободное место в процентах) для объекта, который уже обладает свойствами TotalSize (общий размер) и FreeSpace (свободное место).

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

Get-Process | Select name,vm,pm,@{Label=»TotalMemory»; Expression={$_.vm + $_.pm}}

Как это работает:

• Командлет Select-Object получает команду выбрать свойства VM и PM, которыми данный объект уже обладает.

• Несмотря на то, что действия Select-Object не зависят от регистра клавиатуры, он запоминает, какой регистр был использован для того или иного имени в последний раз. В частности, в данном случае свойство vm будет выведено на экран строчными буквами, поскольку строчные буквы использовались при написании команды.

• Новое свойство имеет имя (ярлык) TotalMemory (общая память). Значение этого свойства высчитывается исходя из значений существующих свойств VM и PM. Элемент Expression в командной строке определяет значение нового свойства как сумму значений двух существующих свойств — VM и PM. Переменная $_ является структурным нулем, который относится к «текущему объекту».

Вы можете относиться к элементу $_ как к пустой ячейке в таблице, которые вы, вероятно, встречали на бумажных бланках. Оболочка автоматически заполняет бланк, вставляя по умолчанию имя текущего объекта, а значит вручную его вписывать необязательно – вместо этого сюда вставляется символ структурного нуля. $_ может использоваться только в конкретных сценариях, в которых оболочка будет его искать. Блок Expression как раз относится к таким сценариям.

Работа с CSV и XML данными

Windows PowerShell обладает возможностью читать и записывать файлы, в которых значения разделены запятой (comma-separated values или CSV), а также простые XML файлы. Для XML-файлов используется специальный пользовательский интерфейс под названием Command Line Interface XML или CliXML.

Экспорт объектов в CSV-файл

Когда вы отправляете объекты по конвейеру в командлет Export-CSV и уточнаяете имя файла, в который необходимо экспортировать объекты, оболочка изучает все объекты в конвейере. Затем она пишет заголовок в виде комментария в первой строчке файла, где указывается имя типа объекта в конвейере. После этого пишется второй заголовок, где перечисляются все свойства объектов в конвейере в виде списка. Начиная с этого места, каждый объект из конвейера записывается в виде строчки CSV-файла, а его свойства заносятся в соответствующие столбцы таблицы. Готовый файл можно без проблем открыть в Microsoft Office Excel, импортировать в одно из многочисленных приложений базы данных, использовать в качестве фиксированной формы стандартного письма в Microsoft Office Word, и.т.д.Простейший пример использования данного командлета может выглядеть так:

Get-EventLog Security –newest 20 | Export-CSV new-events.csv

Также вы можете произвести какие-либо манипуляции с объектами в конвейере, прежде чем импортировать их в CSV-файл:

Get-Process | Sort VM –desc | Select –First 10 | Export-CSV top-vm.csv

Командлет Export-CSV может иметь множество дополнительных параметров, которые применяются для выполнения конкретных задач. Например, вы можете:

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

• Указать, что второй заголовок, включающий список объектов, можно опустить.

• Указать другой разделитель, вместо запятой (символ). О прочих возможностях командлета Export-CSV вы можете узнать из справочной системы.

Важно отметить, что CSV-файл является файлом «плоского» формата, т.е. может включать в себя только один уровень данных. Windows PowerShell не может превратить сложную иерархию объектов в CSV-файл. Например, такой объект как папка в файловой системе может содержать другие объекты – файлы или папки; Export-CSV не сможет использовать эту иерархию. Попробуйте изучить файл, созданный с помощью подобной команды, чтобы, что произойдет:

Dir C:\ | Export-CSV directories.csv

Импорт объектов из CSV-файла

Командлет Import-CSV может читать CSV-файлы (или файлы, где вместо запятых использован другой разделитель), и создавать статичные объекты, отображающие содержимое этих файлов. Каждая строчка CSV файла превращается в отдельный объект, который помещается в конвейер. Свойства объектов конструируются из столбцов таблицы CSV-файла. Если у CSV-файла есть заголовок (он должен быть по умолчанию), то имена свойств объектов берутся из этого заголовка. В справочнике вы найдете информацию о дополнительных возможностях командлета Import-CSV, среди которых можно отметить возможности:

• Указать, что CSV-файл не содержит заголовка.

• Указать, что вместо запятой используется другой разделитель.

Импорт и экспорт XML-файлов

Командлеты Import-CliXML и Export-CliXML работают во многом аналогично командлетам Import-CSV и Export-CSV. Однако вместо «плоского» CSV-файла могут использовать более сложный формат, который способен отобразить иерархическую структуру. Попробуйте запустить команду:

Dir c:\Windows\System32 -recurse | Export-CliXML directories.xml

Вы можете открыть файл в Windows® Notepad, но намного проще это сделать в Internet Explorer, который умеет форматировать XML-файлы, придавая им более читабельный вид. Перевод объекта в формат XML таким способом называется сериализация; перевод XML-файла обратно в объект оболочки называется десериализация. Десериализованные объекты не являются живыми объектами. Они являются скорее слепками или снимками, сделанными в тот момент, когда они подверглись сериализации. Десериализованные объекты не несут никакой функциональности и методов – они представляют собой просто набор свойств. Чтобы увидеть различие, сначала запустите команду:

Get-Process | Get-Member

Обратите внимание на то, как отображаются объекты – каждый из них обладает множеством методов. Затем запустите следующую команду:

Get-Process | Export-CliXML procs.xml

Откройте Windows Notepad или Windows Calculator и запустите следующую команду:

Import-CliXML procs.xm

На первый взгляд, на дисплее будет отображаться та же картинка, что и после первой команды. Однако обратите внимание, что здесь не будет списков – объекты являются десериализованными из XML, а не импортированными из ОС. Сейчас запустите новую команду:

Import-CliXML procs.xml | Get-Member

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

Сравнение объектов

Windows PowerShell обладает возможностью сравнивать два набора объектов. Сравнение может быть довольно сложным и запутанным, так как объекты сами по себе часто являются сложными. Например, возьмем два идентичных процесса, запущенных на разных компьютерах. Пусть это будет Windows Notepad. Некоторые аспекты объектов будут идентичными на обоих компьютерах, например, свойство имени. Другие же свойства, такие как ID, VM и PM будут различаться. Являются ли эти объекты идентичными? Это зависит от того, с какой именно целью вы их сравниваете. Одна из целей сравнивания объектов – это организация внесения изменений. Возможно, вы захотите создать базовую линию, которая бы описывала первоначальную конфигурацию сервера. Позже вы захотите сравнить текущую конфигурацию с той, что была изначально, чтобы узнать, какие изменения произошли. . Windows PowerShel предлагает специальный командлет Compare- Object (с псевдонимом Diff), который упрощает процесс сравнения. Начать можно с создания базового файла. Лучше всего для этой цели подходит XML. Для создания файла с описанием текущей конфигурации компьютерных сервисов запустите команду:

Get-Service | Export-CliXML service-baseline.xml

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

Compare-Object (Get-Service) (Import-CliXML service-baseline.xml)

В данной команде круглые скобки указывают на то, что командлеты Get-Service и Import-CliXML должны быть запущены в первую очередь. Их выходные данные передаются командлету Compare-Object, который сравнивает два набора объектов. В данном примере Compare-Object будет сравнивать все параметры объектов. Однако при работе с другими типами объектов, например, с процессами, память и значение CPU которых постоянно изменяются, сравнивать все их параметры бессмысленно, так как результаты будут постоянно разными. В таком случае вы можете дать командлету Compare-Object задачу учитывать только определенные параметры при сравнении.

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

Сравнение, фильтрация и перечисление

Сравнение

Любое сравнение двух или более объектов или свойств предназначено для того, чтобы получить истинное или ложное значение (True or False value). Данный тип сравнения называют Булевым сравнением, поскольку его результатом всегда является одно из Булевых значений – «правда» или «ложь».

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

Знаки сравнения ставятся между двумя единицами, которые вы хотите сравнить. Наверное, вы помните простые знаки сравнения из программы средней школы:

4 > 10

10 = 5

15 ≤ 15

Windows PowerShell производит сравнение тем же способом, хотя традиционные математические символы здесь не используются. Windows PowerShell выделяет два особых объекта — $True и $False, которые отображают Булевы значения True и False. Например, в процессе сравнения 4 и 10, утверждение о том, что 4 больше 10 будет неверным, значит, результатом будет $False, а утверждение, что 10 равно 10 – верным (результат $True).

Windows PowerShell дает возможность выполнять сравнение непосредственно в командной строке. Для этого просто напечатайте ваше сравнение и нажмите клавишу RETURN, чтобы увидеть результат.

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

Основные операторы

·       -eq – равно

·       -ne – не равно

·       -le – меньше или равно

·       -ge – больше или равно

·       -gt ­ больше, чем

·       -lt – меньше чем

Если данные операторы используются со строками, то они нечувствительны к регистру, в частности результат выполнения команды

“Hello” –eq “HELLO”

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

·       -ceq – Равно (чувствительно к регистру)

·       -cne – не равно (чувствительно к регистру)

·       -cle – меньше или равно (чувствительно к регистру)

·       -cge – больше или равно (чувствительно к регистру)

·       -cgt ­ больше, чем (чувствительно к регистру)

·       -clt – меньше чем (чувствительно к регистру)

В сложных сравнениях вы можете использовать операторы –and, –or и -not

4 –gt 10 –or 10 –gt 4 # returns True

4 –lt 10 –and “Hello” –ne “hello” # returns False

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

(4 –gt 10 –and (10 –lt 4 –or 10 –gt 5)) –and 10 –le 10

Фильтрация конвейеров

Фильтрация – это процесс удаления некоторых объектов из конвейера, обычно по той причине, что они не соответствуют заданным критериям. Как правило, фильтрация оставшихся объектов проводится перед тем, как они передаются другому командлету для дальнейшей обработки.

Фильтрация осуществляется с помощью командлета Where-Object, который имеет псевдоним Where. Главным параметром Where-Object является скриптовый блок, в котором вы уточняете, каким критериям должен отвечать объект для того, чтобы остаться в конвейере. Объекты, которые не удовлетворяют данным критериям, удаляются из конвейера.

Внутри данного блока оболочка ищет специальный элемент, переменную $_, обозначающую структурный нуль. Эта переменная заменяется текущим объектом. По сути скриптовый блок и то сравнение, которое вы поместили в него, будет изучаться отдельно для каждого объекта, который находится в конвейере. Например:

Get-Service | Where-Object { $_.Status –eq «Running» }

Обратите внимание, что скриптовый блок заключен в круглые скобки. Если бы командлет Get-Service сгенерировал 100 объектов, то сравнение командлетом Where-Object было бы проведено 100 раз. Каждый раз переменная $_ будет заменяться новым объектом. После переменной $_ следует точка, которая указывает на то, что сравнение следует производить по одному из свойств объекта, в данном случае это статус. Данный пример представляет собой сравнение значений свойства Статус всех объектов в конвейере с заданным значением – Running (запущенный). Если свойство объекта Статус содержит значение RUNNING, Running, running (мы знаем, что параметр –eq нечувствителен к регистру), то данный объект передается по конвейеру в следующий командлет. Если же свойство Статус объекта не соответствует данному критерию, объект просто пропускается.

Иногда можно спутать предназначение командлетов Select-Object и Where-Object. Запомните, что Where- Object используется для фильтрации всех объектов в конвейере; Select-Object – для выбора ряда объектов (с помощью параметров –first или –last) или для уточнения свойств объектов, которые вы хотите видеть. Если вы знакомы с языком Structured Query Language (SQL), который используется в работе с базами данных, то имена командлетов Select-Object и Where-Object должны также быть для вас знакомыми. Так, Select-Object равнозначен утверждение SQL SELECT и используется для выбора необходимых свойств или объектов, а Where-Object равнозначен утверждению SQL WHERE, которое устанавливает критерии фильтрации.

Where-Object – не всегда является лучшим выбором!

Для того чтобы использовать Where-Object, вы обычно начинаете команду с командлета Get-, например, Get-Process или Get-ADUser.Далее вы передаете все эти объекты по конвейеру командлету Where-Object, который удаляет все объекты, не соответствующие вашим критериям. Для большого количества объектов Where-Object может оказаться неэффективным. Во многих случаях командлеты Get- предлагают свою собственную фильтрацию. Если командлет предлагает возможность фильтрации (чаще всего с помощью параметра –filter), его использование всегда предпочтительнее, нежели использование Where-Object. Такая фильтрация обычно происходит на этапе извлечения данных, то есть, командлет Get- изначально извлекает и передает в конвейер только те объекты, которые соответствуют вашим критериям. Это экономит время и производственные мощности. При работе с Active Directory для таких командлетов как Get-ADUser использование параметра –filter является обязательным, поскольку случайное извлечение всех имен пользователей домена может вызвать привести к непосильной нагрузке на контроллер домена.

Перечисление

Многие так называемые командлеты действия (action cmndlets) – те командлеты, которые производят какие-либо действия или выполняют задачу, созданы для работы с полным набором объектов. Например, представьте себе (но не запускайте!) такую команду:

Get-Process | Stop-Process

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

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

В Windows PowerShell v1 было больше возможностей работать с объектами индивидуально. В v2 Microsoft добавил множество командлетов, предназначенных для работы со всеми объектами сразу, следовательно, количество сценариев, где может потребоваться нумерация объектов или их индивидуальная обработка, сократилось.

Перечисление или инумерация объектов производится с помощью командлета ForEach-Object, который имеет два псевдонима — Foreach и % (да, математический символ процента является псевдонимом ForEach-Object). Типичным параметром для ForEach-Object является скриптовый блок, содержащий информацию о том действии, которое вы собираетесь произвести с каждым из входящих объектов. Внутри этого скриптового блока оболочка ищет переменную $_ и подставляет вместо нее все объекты по очереди Например, вот простейший пример команды, где сначала извлекаются все сервисы, затем отсеиваются запущенные, а затем производится попытка применить метод Start() к оставшимся:

Get-Service | Where-Object { $_.Status –eq “Stopped” } | ForEach-Object { $_.Start() }

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

Get-Service | Where-Object { $_.Status –eq “Stopped” } | Start-Service

Командлет Start-Service может работать со всеми входящими объектами сразу, поэтому, действительно нет необходимости перечислять их, и ндивидуально применять метод Start() к каждому из них.

В последнее время командлет ForEach-Object становится все менее востребованным, поскольку Microsoft постоянно совершенствует и обновляет Windows PowerShell, выпуская новые командлеты. Если у вас возникла необходимость в использовании ForEach-Object, сначала подумайте – быть может есть какой-то более эффективный способ выполнения той же самой задачи с использованием командлета, который работает со всеми объектами сразу. ForEach-Object остается необходимым лишь в тех ситуациях, где нет возможности использовать другой командлет.

Расширенные возможности конвейеров

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

Большинство командлетов Windows PowerShell поддерживают множество параметров; каждый параметр предназначен для приема входящих данных определенного типа. Например, закройте все запущенные копии Windows Notepad, а затем откройте новый документ Windows Notepad. Запустите команду:

Get-Process

Обратите внимание, что ваш документ Windows Notepad появился в списке. Попробуйте остановить процесс, запустив команду:

Stop-Process notepad

Почему вы видите ошибку? В сообщении об ошибке указано, что оболочка не смогла привязать параметр ID, потому что она не смогла конвертировать наши входящие данные, notepad, в 32-битное целое число. Сейчас загляните в раздел справочника, где описывается работа Stop-Process:

Help Stop-Process

Обратите внимание на различные наборы параметров. Набор параметров – это группа параметров, которые могут использоваться вместе. Некоторые параметры могут входить в разные наборы. Например, предположите, что набор параметров А включает параметры –computername и –id. Набор параметров В включает параметры –computername, –name, и –noclobber. Это означает, что вы не можете использовать одновременно параметр –id и параметр –name, так как они находятся в разных наборах параметров. Однако вы можете использовать –id вместе с – computername, поскольку они оба находятся в одном наборе. В первом наборе параметров командлета Stop-Process параметр ID является не опционным, то есть, вы должны указать значение для него. Однако настоящее имя параметра, -id, является опционным – оно заключено в квадратные скобки. Когда мы запустили Stop-Process без указания параметра, оболочка решила, что мы указали «notepad» в качестве значения параметра –id. Но параметр –id требует Int32 – 32-битного целого числа, а «notepad» не может быть конвертирован в этот тип данных.

Третий набор параметров может принимать имя процесса в виде строки, но если вы решите использовать эту технику, то параметр –name не будет опционным. Попробуйте:

Stop-Process –name notepad

Это сработало, так как оболочка поняла, что «notepad» относится к параметру –name, а не –id. Суть всего описанного заключается в том, что все параметры слегка отличаются друг от друга, и каждый из них предназначен для приема данных определенного типа.

Позиционные параметры

Если вы увидите в справочном описании командлета что-то вроде этого:

Stop-Process [-Id] <Int32[]>

это будет означать, что перед вами позиционный параметр. Это означает, что сам параметр необходим, но его имя набирать необязательно. В частности, вы можете напечатать:

Stop-Process –id 53

Или

Stop-Process 53

До тех пор, пока соответствующий тип данных расположен в соответствующем месте (в данном случае на первой позиции), оболочка буде знать, что делать. Данную информацию можно найти в разделе с полным описанием командлета в справочнике:

Help Stop-Process –full

Здесь вы можете увидеть, что параметр является позиционным, что он занимает позицию номер 1 и является обязательным:

-Id <Int32[]>

Specifies the process IDs of the processes to be stop

type «get-process». The parameter name («Id») is optio

(Этот параметр уточняет ID процессов, которые необходимо остановить. Наберите «get-process». Параметр имени («Id») является опционным:)

Required? true

Position? 1

Default value

Accept pipeline input? true (ByPropertyName)

Accept wildcard characters? False

Вот еще один пример из раздела описания командлета Get-ChildItem в справочнике:

Get-ChildItem [[-Path] <string[]>] [[-Filter] <string>] [-Exclude <string[]>]

В данном примере весь параметр –path является опционным. Как вы видите, весь параметр, включая тип данных string[], заключен в квадратные скобки. Однако само имя параметра –path находится в отдельных квадратных скобках. Это означает, что параметр является опционным, и если вы захотите использовать его, вы можете опустить его имя, если его значение указано на первой позиции. Параметр –filter также является опционным и позиционным, параметр –exclude – опционным, но не позиционным. Если вы захотите использовать –exclude, вы будете должны указать его имя.

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

Dir –path c:\

Но поскольку –path является позиционным параметром, вы можете набрать более простую и привычную команду:

Dir c:\

Однако использование имен параметров имеет два преимущества:

• Это делает команду намного более понятной для кого бы то ни было, поскольку имя параметра позволяет лучше разобраться в том. Что происходит.

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

Например, обратите внимание на команду:

Add-Member NoteProperty ComputerName LON-DC1

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

Add-Member –memberType NoteProperty –Name ComputerName –Value LON-DC1

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

Вы использовали позиционные параметры в течение всего курса. Dir, который, конечно, является псевдонимом для командлета Get-ChildItem может стать ярким примером. Where-Object – еще одним примером. Рассмотрим команду:

Get-Service | Where-Object { $_.Status –eq “Running” }

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

Get-Service | Where-Object –FilterScript { $_.Status –eq “Running”}

Привязка данных конвейера по значению

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

Get-Service | Where-Object { $_.Status –eq “Running” }

Здесь вы передаете объекты командлету Where-Object. Но что именно делает Where-Object с этими объектами? Заглянем в справочник.

-InputObject <psobject>

Specifies the objects to be filtered. You can a

(Указывает, какие объекты следует отфильтровать. )

Required? false

Position? named

Default value

Accept pipeline input? true (ByValue)

Accept wildcard characters? False

Командлет поддерживает только два параметра: -FilterScript и –InputObject. Критерий фильтрации передается параметру –FilterScript по позиции. Что же происходит с –InputObject? –InputObject привязывается к входящим из конвейера данным. Из справочника вы можете узнать, что этот параметр принимает входящие данные по значению. Тип входящих данных, который он требует, указан прямо рядом с именем параметра — <psobject>.. Это означает, что принимаются объекты любого типа. В справочнике говорится: «Указывает, какие объекты следует отфильтровать». Это означает, что этот параметр содержит объекты, подлежащие фильтрации.

Как это работает:

1. Get-Service обрабатывает и производят ряд служебных объектов.

2. Служебные объекты передаются командлету Where-Object.

3. Where-Object «видит», что есть данные для параметра –FilterScript.

4. Where-Object также «видит», что по каналу входящих данных поступает множество объектов. Where-Object проверяет, может ли какой-либо из его параметров принять эти объекты по значению.

5. Where-Object определяет, что его собственный параметр может принять этот тип данных по значению.

Многие командлеты могут привязывать входящие данные по значению. Найдите в справочнике полную информацию по таким командлетам как Stop- Process, Stop-Service, Start-Service, Remove-ChildItem и другим.

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

Привязка данных конвейера по имени свойства

Этот тип привязки входящих данных является более сложным. В рамках данной техники оболочка ищет имя параметра, после чего проверяют, обладают ли входящие объекты соответствующими свойствами. Если да – соответствующее свойство привязывается к параметру. Обратите внимание, что данный тип привязки встречается только тогда, когда оболочка не смогла привязать входящие данные по значению. Например, изучите справочную информацию по командлету Invoke-Command. Обратите внимание, что параметр –inputObject привязывает входящие данные по значению и принимает такой тип входящих данных, как объекты [object]. Этот тип объектов [object] является общим типов. По сути все что угодно можно назвать объектом. Это означает, что –inputObject всегда будет привязывать входящие данные по значению. То есть, для параметра не будет возможности привязать входящие данные по имени свойства.

Изучите полную информацию по командлету Get-Service, и вы обнаружите следующий параметр:

-ComputerName <string[]>

Gets the services running on the specified computers

Type the NetBIOS name, an IP address, or a fully qua

, a dot (.), or «localhost».

This parameter does not rely on Windows PowerShell or

configured to run remote commands.

Required? false

Position? named

Default value Localhost

Accept pipeline input? true (ByPropertyName)

Accept wildcard characters? False

(Здесь текст был урезан, чтобы поместиться в формат книги; чтобы прочитать его полностью, изучите раздел справочника по командлету Get-Service).

В справочнике указано, что параметр –computername принимает входящие данные из конвейера по имени свойства. Одним из способов запустить данную команду будет:

Get-Service –computername LON-DC1

Можно даже перечислить имена компьютеров через запятую:

Get-Service –computername LON-DC1,SEA-DC1

Однако можно использовать и другую технику – принять входящие данные, используя свойство ComputerName. Например, вы можете создать с помощью Windows Notepad такой файл:

ComputerName

LON-DC1

SEA-DC1

Его следует сохранить как CSV-файл. Несмотря на то, что здесь нет запятых, это полноценный CSV-файл: здесь есть заголовок с именем столбца и две строчки данных. Здесь не нужны запятые, поскольку столбец всего один. Файл можно импортировать в оболочку с помощью команды:

Import-CSV computernames.csv

Командлет Import-CSV произведет в качестве выходных данных два объекта, каждый из которых будет обладать свойством ComputerName. Эти объекты можно передать командлету Get-Service:

Import-CSV computernames.csv | Get-Service

Поскольку свойство объектов ComputerName совпадает с параметром –computername, ваши два имени будут отправлены в качестве входящих данных параметру –computername, и командлет Get-Service попытается извлечь данные из обоих компьютеров.

Параметр, осуществляющий привязку по имени свойства, работатет только тогда, когда входящие объекты имеют имя свойства, которое полностью и в точности совпадает с именем параметра (хотя регистр здесь не учитывается). Так, свойство под названием comp не совпадет с параметром –computername.

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

Предположим, вы используете командлет, который генерирует имена компьютеров, и хотите передать эти имена компьютеров другому командлету, который обладает параметром –computername. Проблема в том, что первый командлет может не суметь превратить имена компьютеров в свойство computername. Примером может быть командлет Get-ADComputer.

Мы еще не рассматривали командлеты Active Directory; мы приступим к этому лишь в следующей главе. Пока просто используйте Get-ADComputer в качестве примера. Можете попробовать запустить следующие команды, если вы используете контроллер домена классной комнаты и пользуетесь при этом либо консолью Windows PowerShell, либо Windows PowerShell ISE.

Запустите команды:

Import-Module ActiveDirectory

Get-ADComputer –filter *

Результат будет примерно следующим:

DistinguishedName : CN=SERVER-R2,OU=Domain

Controllers,DC=company,DC=pri

DNSHostName : server-r2.company.pri

Enabled : True

Name : SERVER-R2

ObjectClass : computer

ObjectGUID : 0f04c9d6-44af-4e4f-bb7e-4ebc52ab343f

SamAccountName : SERVER-R2$

SID : S-1-5-21-1842503001-3345498097-2301419571-1000

UserPrincipalName

Данные объекты имеют свойство Name. Это не соответствует параметру –computerName, который привязывает входящие данные по имени свойства. Поэтому, например, данная команда не увенчается успехом:

Get-ADComputer –filter * | Get-Service

Тем не менее, вы можете сделать нечто подобное. Например, использовать Select-Object, чтобы добавить новые свойства объектам. Свойство получит имя computername и будет содержать то же значение, что и существующее свойство name. Вот команда:

Get-ADComputer –filter * | Select

@{Label=”ComputerName”;Expression={$_.Name}}

В результате вы получите объекты, обладающие только одним свойством – ComputerName. Если вы хотите сохранить существующие свойства, вы должны дать команду Select-Object включить эти свойства в выходные данные:

Get-ADComputer –filter * | Select *,

@{Label=”ComputerName”;Expression={$_.Name}}

Добавление символа * к списку свойств означает команду сохранить все свойства из входящих данных. С новым свойством computername данная команда сработает (конечно, учитывая, что у вас есть разрешение на соединение с удаленными компьютерами):

Get-ADComputer –filter * | Select *,

@{Label=”ComputerName”;Expression={$_.Name}} | Get-Service

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

passThru

Большинство так называемых «командлетов действия» могут принимать входящие данные, но не могут производить что-либо. Хорошим примером является командлет New-ADUser. Например, вы можете создать простой пользовательский аккаунт с помощью команды:

New-ADUser –name JohnD –samaccountname JohnD

Однако никаких выходных данных произведено не будет, и имя пользователя будет находиться в отключенном состоянии. Если вы хотите «оживить» пользователя, то после предыдущей команды запустите такую:

Get-ADUser –filter “name –eq JohnD” | Enable-ADAccount

Однако командлет New-ADUser, так же как и многие другие командлеты действия, поддерживает параметр –passThru. Этот параметр дает командлету команду отправлять в конвейер в качестве выходных данных тот объект, с которым он работал или который он создал. Поэтому, можете попробовать что-то в этом роде:

New-ADUser –name JohnD –samaccountname JohnD –passThru | Enable-ADAccount

Stop-Service – еще один командлет, который поддерживает –passThru. Обычно Stop-Service не производит никаких выходных данных. Однако с помощью –passThru он меняет поведение. Попробуйте:

Get-Service –name BITS | Stop-Service –passthru

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

Лучшие бесплатные программы для сравнения файлов для Windows

  • Категория: Программное Обеспечение

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



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

Некоторые онлайн-сервисы, Dropbox, Google Drive или OneDrive, также поддерживают редактирование файлов и могут отображать различия в версиях файлов, но для этого требуется, чтобы вы использовали эти сервисы и имели доступ к Интернету.

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



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

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

Требования

  • Программное обеспечение должно быть полностью совместимо со всеми последними 32- и 64-разрядными версиями операционной системы Windows.
  • Должна быть доступна бесплатная версия.
  • Основной функцией программы должно быть сравнение файлов. Это означает, что текстовые редакторы с модулями сравнения файлов не включены в список.

Верхний список

AptDiff



AptDif — это инструмент визуального сравнения файлов для Windows. При запуске отображается приглашение, которое вы используете для выбора двух файлов, которые хотите сравнить, и того, хотите ли вы сравнить текстовое или двоичное содержимое.

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



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

Обновить : Веб-сайт AptDiv больше не доступен. Вы по-прежнему можете скачать программу со сторонних сайтов загрузки, таких как Softpedia ,

DiffMerge



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

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

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

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

Размытый

Diffuse был разработан специально для сравнения кода. Он поддерживает несколько десятков языков программирования и сценариев и автоматически использует подсветку синтаксиса при распознавании языка.

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

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

ExamDiff

Бесплатная версия ExamDiff доступна в виде переносимой программы и установщика. Он отображает приглашение выбрать два файла в системе при запуске, а затем отображает их рядом друг с другом в интерфейсе.

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

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

KDiff3

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

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

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

отчет

Meld требует, чтобы в системе был установлен Python 2. Он поставляется с ним и установит необходимые компоненты, если вы не отключите этот параметр во время установки.

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

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

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

tkdiff

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

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

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

WinMerge

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

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

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

Наконечник: WinMerge 2011 это официальный форк, который находится в активной разработке.

Сравнительная таблица

название портативный Характеристики Другой
AptDifнетСравнить как двоичный или текстовый
DiffMergeдаПапка различий, слияние, экспортВерсии для Linux и Mac
РазмытыйнетN-стороннее слияние файловВерсии для Linux и Mac
ExamDiffдаИнтерфейс командной строки
KDiff3нетдвух- и трехстороннее сравнениеИнструменты командной строки, версии для Linux и Mac
отчетдадвух- и трехстороннее сравнение, слияние, различие папокВерсии для Linux и Mac, требуется Python 2
tkdiffнетсращиваниеВерсии для Linux и Mac
WinMergeдаСлияние, папка diffПоддержка плагинов

Рекомендация

Итак, какой инструмент сравнения файлов вам подходит? Я не могу на это ответить, но вместо этого могу дать вам рекомендации. Инструмент, который поразил меня больше всего, — это Meld. Хотя для этого требуется установка Python 2, он поддерживает множество различных функций, доступен кросс-платформенный и, помимо всего прочего, поддерживает различие папок.

отчет


Для Windows

Скачать сейчас

Кроме того, что не менее важно, он часто обновляется. Более легким вариантом является Kdiff3, который хорошо работал во время тестов, и если вам требуется двоичное сравнение файлов, вы можете вместо этого проверить Aptdif.

KDiff3


Для Windows

Скачать сейчас

Теперь ваша очередь : Использовать другой инструмент для сравнения файлов? Не стесняйтесь поделиться им со всеми нами в разделе комментариев ниже.

Powershell дата создания файла

Get-Date возвращает в Powershell дату и время. С помощью этого командлета мы можем получить нужное нам значение формата Datetime, что поможет нам выполнять, например, сравнение дат.

Т.е. выполнение команды без ключей вернет нам текущую дату в powershell:

Если нам нужно получить какую-то другую дату формата Datetime, то надо установить ее с помощью этого команды:

Если мы не установим какое-то значение, например Year (год), то он возьмется текущий.

Как минусовать день в Powershell Get-Date

Получим свойства и методы этого объекта:

Все методы — это то что мы можем сделать с датой. Для примера получим дату минус один день от сегодняшнего числа:

Или прибавить дни через AddDays:

Если мы прибавим, допустим, часы больше чем в сутках, то у нас изменится и день:

Таким же образом мы можем добавлять и убирать такие элементы дат:

  • AddDays — дни
  • AddHours — часы
  • AddMilliseconds — миллисекунды
  • AddMinutes — минуты
  • AddMonths — месяца
  • AddSeconds — секунды
  • AddYears — года

Преобразование в Powershell даты в строку и из строки

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

  • ToLongDateString — строка с днем недели и именем месяца
  • ToLongTimeString — показывает часы, минуты и время
  • ToShortDateString — возвращает только дату
  • ToShortTimeString — вернет только часы и минуты
  • ToString — вернут полную дату и время

Каждый из этих методов вызывается так:

Или на примере какой-то другой даты с переменной:

Для того что бы получить дату из строки нужно использовать ключ date:

Если мы не установим время или дату, то значение возьмется текущее:

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

Получение частей даты и времени через ключ Format в Powershell Get-Date

Возможно получить только день недели или час от времени и для этого нужно использовать Format или один из методов. Так я получу год:

Или аналогично, но уже используя свойство:

Используя Format всегда возвращается тип данных string, а не DateTime.

У нас есть еще множество свойств, кроме Year, которые мы можем получать:

Выведем день недели ( DayOfWeek):

Обратите внимание, что не всегда возвращаемый объект типа DateTime. Он может быть и численным (int) или строковым, в случае с Format.

На примере Format есть много спецификаторов:

  • dddd — день недели в виде имени
  • MM — номер месяца
  • dd — день месяца
  • yyyy — год
  • HH:mm — часы и минуты
  • K — Часовой пояс
  • ss — секунды

Так мы выведем дату формата часы, минуты, день, месяц и год:

Обращаете внимание на регистр иначе получим другие значение.

Сравнение дат в Powershell

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

Либо у получить это значение так:

Для примера сравним в powershell даты файла. На картинке выше видно, что у каждого файла есть свойство CreationTime формата DateTime. Сравним какие файлы были созданы за последние 15 дней:

GT — говорит о том, что мы ищем значения только больше чем справа. Обо всех операторах сравнения мы говорили тут.

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

Другие примеры с Powershell Get-Date

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

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

Просмотр содержимого дисков Windows PowerShell и управление хранящимися на них элементами аналогично управлению файлами и папками на физических дисках Windows. Navigating through Windows PowerShell drives and manipulating the items on them is similar to manipulating files and folders on Windows physical disk drives. В этом разделе мы обсудим выполнение конкретных задач по управлению файлами и папками с помощью PowerShell. This section discusses how to deal with specific file and folder manipulation tasks using PowerShell.

Получение списка файлов и папок, содержащихся в папке Listing All the Files and Folders Within a Folder

Извлечь все элементы непосредственно из папки можно с помощью командлета Get-ChildItem. You can get all items directly within a folder by using Get-ChildItem. Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Add the optional Force parameter to display hidden or system items. Например, эта команда отображает непосредственное содержимое диска C Windows PowerShell (которое совпадает с содержимым физического диска C Windows): For example, this command displays the direct contents of Windows PowerShell Drive C (which is the same as the Windows physical drive C):

Эта команда выводит только элементы, содержащиеся на диске непосредственно, так же как и команда DIR оболочки Cmd.exe или команда ls оболочки UNIX. The command lists only the directly contained items, much like using Cmd.exe’s DIR command or ls in a UNIX shell. Для показа вложенных элементов необходимо также указать параметр -Recurse. In order to show contained items, you need to specify the -Recurse parameter as well. (Время выполнения этой операции будет очень велико.) Для вывода всего содержимого диска C введите: (This can take an extremely long time to complete.) To list everything on the C drive:

Командлет Get-ChildItem позволяет отфильтровать элементы с помощью параметров Path, Filter, Include и Exclude, но обычно осуществляется лишь фильтрация по имени. Get-ChildItem can filter items with its Path, Filter, Include, and Exclude parameters, but those are typically based only on name. Сложную фильтрацию на основе других свойств элементов можно выполнить с помощью командлета Where-Object. You can perform complex filtering based on other properties of items by using Where-Object.

Следующая команда находит все исполняемые файлы в папке Program Files, которые были в последний раз изменены после 1 октября 2005 г. и размер которых не менее одного мегабайта и не более десяти мегабайт: The following command finds all executables within the Program Files folder that were last modified after October 1, 2005 and which are neither smaller than 1 megabyte nor larger than 10 megabytes:

Копирование файлов и папок Copying Files and Folders

Копирование выполняется с помощью командлета Copy-Item. Copying is done with Copy-Item. Следующая команда создает резервную копию C:oot.ini в C:oot.bak: The following command backs up C:oot.ini to C:oot.bak:

Если целевой файл уже существует, то попытка копирования завершается неудачей. If the destination file already exists, the copy attempt fails. Чтобы перезаписать имеющийся целевой файл, используйте параметр Force. To overwrite a pre-existing destination, use the Force parameter:

Эта команда работает, даже если целевой объект доступен только для чтения. This command works even when the destination is read-only.

Так же выполняется и копирование папок. Folder copying works the same way. Эта команда рекурсивно копирует папку «C: emp est1» в новую папку «c: empDeleteMe». This command copies the folder C: emp est1 to the new folder C: empDeleteMe recursively:

Можно также скопировать избранные элементы. You can also copy a selection of items. Следующая команда копирует все файлы .txt, содержащиеся в папке «c:data», в папку «c: emp ext»: The following command copies all .txt files contained anywhere in c:data to c: emp ext:

Для копирования элементов файловой системы можно использовать и другие средства. You can still use other tools to perform file system copies. В Windows PowerShell по-прежнему работают команды XCOPY, ROBOCOPY и такие COM-объекты, как Scripting.FileSystemObject. XCOPY, ROBOCOPY, and COM objects, such as the Scripting.FileSystemObject, all work in Windows PowerShell. Например, можно воспользоваться COM-классом Scripting.FileSystem сервера сценариев Windows для создания резервной копии файла C:oot.ini в файле C:oot.bak: For example, you can use the Windows Script Host Scripting.FileSystem COM class to back up C:oot.ini to C:oot.bak:

Создание файлов и папок Creating Files and Folders

Создание новых элементов осуществляется одинаковым образом всеми поставщиками Windows PowerShell. Creating new items works the same on all Windows PowerShell providers. Если поставщик Windows PowerShell поддерживает более одного типа элементов (например, поставщик Windows PowerShell FileSystem различает каталоги и файлы), необходимо указать тип элемента. If a Windows PowerShell provider has more than one type of item—for example, the FileSystem Windows PowerShell provider distinguishes between directories and files—you need to specify the item type.

Эта команда создает папку «C: empNew Folder»: This command creates a new folder C: empNew Folder:

Эта команда создает пустой файл «C: empNew Folderfile.txt»: This command creates a new empty file C: empNew Folderfile.txt

Удаление всех файлов и папок, содержащихся в папке Removing All Files and Folders Within a Folder

Удалить вложенные элементы можно с помощью командлета Remove-Item, однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. You can remove contained items using Remove-Item, but you will be prompted to confirm the removal if the item contains anything else. Например, при попытке удаления папки C: empDeleteMe, которая содержит другие элементы, Windows PowerShell предварительно предложит подтвердить удаление этой папки: For example, if you attempt to delete the folder C: empDeleteMe that contains other items, Windows PowerShell prompts you for confirmation before deleting the folder:

Если подтверждение для каждого вложенного элемента нежелательно, задайте параметр Recurse: If you do not want to be prompted for each contained item, specify the Recurse parameter:

Подключение локальной папки как диска Mapping a Local Folder as a drive

Подключить локальную папку можно с помощью команды New-PSDrive. You can also map a local folder, using the New-PSDrive command. Следующая команда создает локальный диск P:, корневым каталогом которого является локальный каталог Program Files, отображающийся только в сеансе PowerShell: The following command creates a local drive P: rooted in the local Program Files directory, visible only from the PowerShell session:

Как и при использовании сетевых дисков, диски, отображенные в Windows PowerShell, немедленно становятся доступными оболочке Windows PowerShell. Just as with network drives, drives mapped within Windows PowerShell are immediately visible to the Windows PowerShell shell. Чтобы создать подключенный диск, отображающийся в проводнике, нужен параметр -Persist. In order to create a mapped drive visible from File Explorer, the parameter -Persist is needed. Но с этим параметром можно использовать только удаленные пути. However, only remote paths can be used with Persist.

Чтение текстового файла в массив Reading a Text File into an Array

Одним из наиболее общих форматов хранения текстовых данных является файл, отдельные строки которого рассматриваются как отдельные элементы. One of the more common storage formats for text data is in a file with separate lines treated as distinct data elements. Командлет Get-Content используется для чтения всего файла за один шаг, как показано далее. The Get-Content cmdlet can be used to read an entire file in one step, as shown here:

Командлет Get-Content сразу рассматривает данные, считанные из файла, как массив с одним элементом на строку содержимого файла. Get-Content already treats the data read from the file as an array, with one element per line of file content. Убедиться в этом можно, проверив свойство Length полученного содержимого: You can confirm this by checking the Length of the returned content:

Эта команда наиболее полезна для непосредственного ввода в Windows PowerShell информационных списков. This command is most useful for getting lists of information into Windows PowerShell directly. Например, можно хранить в файле «C: empdomainMembers.txt» список имен компьютеров или IP-адресов по одному имени на каждую строку файла. For example, you might store a list of computer names or IP addresses in a file C: empdomainMembers.txt, with one name on each line of the file. Можно использовать командлет Get-Content, чтобы извлечь содержимое файла и поместить его в переменную $Computers: You can use Get-Content to retrieve the file contents and put them in the variable $Computers:

Теперь переменная $Computers представляет собой массив, содержащий в каждом элементе имя компьютера. $Computers is now an array containing a computer name in each element.

Джеффри Хикс опубликовал очередную статью по PowerShell, посвященную на этот раз управлению файловыми серверами. Мы решили разбить ее на две части: построение отчетов по файловому серверу и непосредственно управление файловыми шарами. В первой части рассмотрим отчеты.
В посте будут рассмотрены следующие вопросы:

  • Как вывести список всех сетевых папок на компьютере (компьютерах)
  • Создаем отчеты о размерах сетевых папок
  • Определяем владельцев файлов
  • Находим дату создания файлов выявляем «старые» файлы и файлы, созданные за определенный промежуток времени)

Итак, под катом вы найдете перевод статьи File Server Management with Windows PowerShell.

Получаем все сетевые папки

Начнем с того, что определим, что же расшарено. Задача проста: просто осуществляем запрос класса Win32_Share, чтобы использовать Windows Management Instrumentation (WMI). Вам даже не нужно логиниться на файловом сервере. Вы можете запустить эту команду откуда угодно.

Вместо chi-fp01 укажем имя интересующего нас компьютера

Запустив эту команду Вы получите все сетевые папки, включая принтеры (если таковые имеются). Но так как мы говорим о файловых шарах, то давайте ограничим запрос. Все экземпляры Win32_Share имеют свойство Type, как показано в таблице 1.

Добавим фильтр в первоначальную команду:

Тем самым мы выводим только нужную информацию.

Но если вы ищите также и скрытые папки – те, которые заканчиваются знаком доллара ($) – фильтр придется слегка переписать:

В WMI знак процента (%) используется вместо знака подстановки (wildcard). Вывести все папки, кроме тех, которые скрыты чуть сложнее.

Команда выведен все объекты Win32_Share, у которых свойство Type равно 0 и имя не заканчивается на $.

Получаем размер сетевой папки

Довольно часто необходима информация о том, сколько места занимают файловые шары. Используем Get-ChildItem, или его сокращение dir, и передадим результаты в Measure-Object:

В итоге вы получите информацию об общем числе объектов, размер в байтах, наименьшие и наибольшее размерах файлов. В предыдущей команде, применил фильтр. В PowerShell 3.0 то же самое можно сделать проще, однако та команда, которую я использовал, работает как v2.0, так и 3.0. Ее лучше всего запускать локально. Код в примере 1 комбинирует эту команду с нашей техникой WMI, чтобы получить отчет о размере высокоуровневых папок.

Пример 1: Отчет о размерах высокоуровневых сетевых папок

Вы можете форматировать или обрабатывать $results как вашей душе будет угодно. Нужна удобоваримая таблица? Просто используйте следующую команду:

Тем самым можно сделать полный отчет по использованию всех папок на файловом сервере не составляет труда. Сэкономьте время, воспользуетесь примером 2.

Пример 2: Отчет об использовании файловых шар

И снова я слегка отформатирую таблицу.

Получаем файлы по владельцу

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

Мы можем группировать по свойству нового владельца и затем обрабатывать новый объект.

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

Пример 3: Группируем файловые шары по владельцу

Я также должен указать на то, что могут проблемы: с файлами, имя которых более 260 символов или содержит необычные символы, особенно если вы пытаетесь запустить Get-ACL. В PowerShell 3.0 этот командлет имеет параметр -LiteralPath, что помогает решить вышеуказанные проблемы.

Опять выведем читаемую таблицу.

Получаем файлы по дате создания

Последняя техника создания отчетов, которую я хочу продемонстрировать – это создание отчета с последними созданными файлами. Фактически, мы создаем коллекцию объектов, которую можем использовать несколькими способами. Возможно вы захотите использовать объекты или удалить или переместить файлы, или можете захотите построить отчет, который можно отправить руководству. Всегда создавайте команды PowerShell так, чтобы потом их можно использовать.
Определить возраст файл не так просто. В PowerShell файловый объект (объект типа файл) имеет несколько свойств, которые вы возможно захотите использовать. Например, команда:

дает вывод, представленный на скриншоте ниже.

Лично я считаю, что лучше использовать LastWriteTime, который обозначает, когда к файлу в последний раз обращались. Мне встречались ситуации, когда LastAccessTime обновлялся через сторонние программы, например, антивирус, что само по себе уже не означает правды. И LastAccessTime был деактивировал еще со времени Windows Vista, хотя вы можете его включить. Вам также нужно быть осторожным, потому что эти значения могут меняться в зависимости от того, копируете ли вы или перемещаете файлы между дисками (between volumes). Но вы можете решить это сами. Используя этот файл как пример, мы может заставить PowerShell сказать нам, насколько стар файл. См. пример 4.

Пример 4. Определяем возраст файлов

Свойство Age является объектом TimeSpan, и свойство Days является просто свойством TotalDays этого объекта. Но так как мы можем этом сделать для одного файла, мы можем сделать и для других Давайте взглянем на мою общую папку и найдем все файлы, которые не менялись за последние 400 дней.

Я пойду дальше и включу еще и владельца файла. На скриншоте ниже показаны результаты от запуска этого код в удаленной сессии на моем файловом сервере.

Я могу сохранить эти результаты в переменную и использовать их в любое время. Так как у меня есть полное имя файла, передать в другую команду, например, Remove-Item, не составит труда.
Одной из моих любимых техник является определение того, сколько файлов было изменено за год.

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

Полезно знать, сколько файлов не изменялось за 30, 90 или 180 дней. К сожалению, простого способа использовать Group-Object для этого не существует, поэтому мне необходимо придется «пойти иным путем»; смотрите пример 5.

Пример 5: Определяем период изменения файлов

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

За основу поста использована первая часть статьи File Server Management with Windows PowerShell.

Кстати, о том, как найти файлы с помощью PowerShell и WMI Джеффри Хикс пишет в своем блоге (часть 1 и 2).

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

Используйте PowerShell для сравнения двух файлов

Доктор Скрипто

Резюме : Microsoft Scripting Guy, Ed Wilson, рассказывает об использовании Windows PowerShell для сравнения двух файлов.

 Эй, сценарист! У меня есть скрипт, который я написал для сравнения двух файлов, но он кажется очень медленным. Мне интересно, что я могу сделать, чтобы немного ускорить процесс.

— JW

 Здравствуйте, JW,

.

Эд Уилсон, сценарист Microsoft, здесь.Я посмотрел предоставленный вами сценарий, в котором вы используете Compare-Object для сравнения двух файлов. Вот ваш скрипт:

$fileA = «C:\fso\myfile.txt»

$fileB = «C:\fso\CopyOfmyfile.txt»

$fileC = «C:\fso\changedMyFile.txt»

if(Compare-Object -ReferenceObject $(Get-Content $fileA) -DifferenceObject $(Get-Content $fileB))

 {«файлы разные»}

Еще {«Файлы одинаковые»}

Когда я запускаю сценарий и сравниваю файл A с файлом B, сценарий возвращает правильный ответ:

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

Здесь показаны три файла:


Итак, JW, это очень простой тест.Что на самом деле происходит при использовании Compare-Object ?

Я могу использовать Windows PowerShell ISE, чтобы запустить часть кода и просмотреть его. Для этого я выделяю оператор Compare-Object и нажимаю F-8, чтобы выполнить только эту часть кода. Это показано здесь:

PS C:\> Compare-Object -ReferenceObject $(Get-Content $fileA) -DifferenceObject $(Get-Content $fileC)

InputObject                                            SideIndicator                                       

————                                           ——––                                       

Дополнительные значения                                      =>          

И когда я сравниваю FileA с FileB, появляется следующее:

PS C:\> Compare-Object -ReferenceObject $(Get-Content $fileA) -DifferenceObject $(Get-Content $fileB)

PS C:\> 

Запускает часть кода ELSE .Хотя это работает, это может быть немного медленным, и я думаю, что для более сложных файлов это будет немного ненадежно.

Таким образом, лучший способ сделать это — использовать Get-FileHash и сравнить свойство HASH . Ваш измененный скрипт показан здесь:

$fileA = «C:\fso\myfile.txt»

$fileB = «C:\fso\CopyOfmyfile.txt»

$fileC = «C:\fso\changedMyFile.txt»

if((Get-FileHash $fileA).hash -ne (Get-FileHash $fileC).hash)

 {«файлы разные»}

Еще {«Файлы одинаковые»}

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

Далее я выполняю только часть сценария Get-FileHash :

PS C:\> (Get-FileHash $fileA).hash  -ne (Get-FileHash $fileC).hash

Правда

PS C:\> (Get-FileHash $fileA).hash  -ne (Get-FileHash $fileB).hash

Ложь

Кроме того, код Get-FileHash довольно эффективен, поскольку Windows PowerShell довольно быстро получает хэш файла. Кроме того, эта операция просто получает хэши файлов и сравнивает два хэша.Ваш исходный скрипт считывает весь файл, а затем сравнивает его построчно, поэтому он гораздо менее эффективен.

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

Приглашаю вас подписаться на меня в Twitter и Facebook. Если у вас есть какие-либо вопросы, отправьте мне электронное письмо по адресу [email protected] или опубликуйте свои вопросы на официальном форуме разработчиков сценариев. До завтра.А пока мир.

Эд Уилсон, Microsoft Scripting Guy  

Доктор Скрипто

Скриптер, PowerShell, vbScript, BAT, CMD

Подписаться

объект сравнения (Microsoft.PowerShell.Utility) — PowerShell | Документы Майкрософт

Полезна ли эта страница?

да Нет

Любая дополнительная обратная связь?

Отзыв будет отправлен в Microsoft: при нажатии кнопки отправки ваш отзыв будет использован для улучшения продуктов и услуг Microsoft. Политика конфиденциальности.

Представлять на рассмотрение

Сравнивает два набора объектов.

В этой статье

Синтаксис

  Объект сравнения
       [-ReferenceObject] 
       [-DifferenceObject] 
       [-SyncWindow ]
       [-Свойство <Объект[]>]
       [-ExcludeDifferent]
       [-IncludeEqual]
       [-Пройти через]
       [-Культура ]
       [-Деликатный случай]
       [<Общие параметры>]  

Описание

Командлет Compare-Object сравнивает два набора объектов.Один набор объектов — это ссылка , а другой набор объектов — это разница .

Compare-Object проверяет доступные методы сравнения всего объекта. Если он не может найти подходящий метод, он вызывает методы ToString() объектов ввода и сравнивает строку Результаты. Вы можете указать одно или несколько свойств, которые будут использоваться для сравнения. Когда свойства при условии, что командлет сравнивает только значения этих свойств.

Результат сравнения указывает, появилось ли значение свойства только в ссылке объекта ( <= ) или только в объекте разности ( => ). Если параметр IncludeEqual используется, ( == ) указывает, что значение находится в обоих объектах.

Если ссылка или разность объектов являются нулевыми ( $null ), Compare-Object генерирует завершающая ошибка.

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

Примеры

Пример 1. Сравнение содержимого двух текстовых файлов

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

  • Testfile1.txt содержит значения: собака, белка и птица.
  • Тестовый файл2.txt содержит значения: кошка, птица и енот.

В выходных данных отображаются только те строки, которые различаются между файлами. Testfile1.txt — это ссылка на объект ( <= ) и Testfile2.txt - это объект разницы ( => ). Линии с содержимое, которое появляется в обоих файлах, не отображается.

  Compare-Object -ReferenceObject (Get-Content -Path C:\Test\Testfile1.txt) -DifferenceObject (Get-Content -Path C:\Test\Testfile2.текст)

Индикатор стороны ввода объекта
----------- -------------
кошка =>
енот =>
собака <=
белка <=  

Пример 2. Сравните каждую строку содержимого и исключите различия

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

Начиная с PowerShell 7.1, при использовании параметра ExcludeDifferent выводится IncludeEqual . и выходные данные содержат только строки, содержащиеся в обоих файлах, как показано SideIndicator ( == ).

  $объекты = @{
  ReferenceObject = (Get-Content-Path C:\Test\Testfile1.txt)
  DifferenceObject = (Get-Content-Path C:\Test\Testfile2.txt)
}
Сравнить-объект @objects-ExcludeDifferent

Индикатор стороны ввода объекта
----------- -------------
птица ==  

Пример 3. Показать разницу при использовании параметра PassThru

Обычно Compare-Object возвращает тип PSCustomObject со следующими свойствами:

  • Объект InputObject сравнивается
  • Свойство SideIndicator , показывающее, какому объекту ввода принадлежит вывод

При использовании параметра PassThru Тип объекта не изменяется, но экземпляр возвращаемого объекта имеет добавленный NoteProperty с именем SideIndicator . Боковой индикатор показывает, какому входному объекту принадлежит выход.

В следующих примерах показаны различные типы вывода.

  $а = $Истина
Объект сравнения -IncludeEqual $a $a
(Compare-Object -IncludeEqual $a $a) | Get-Member

Индикатор стороны ввода объекта
----------- -------------
       Правда ==

   Имя Типа: System.Management.Automation.PSCustomObject
Имя MemberType Определение
---- ---------- ----------
Метод Equals bool Equals(System.объект объект)
Метод GetHashCode int GetHashCode()
GetType Тип метода GetType()
Строка метода ToString ToString()
InputObject NoteProperty System.Boolean InputObject=True
Строка SideIndicator NoteProperty SideIndicator===

Compare-Object -IncludeEqual $a $a -PassThru
(Compare-Object -IncludeEqual $a $a -PassThru) | Get-Member

Истинный

   Имя Типа: System.Boolean
Имя MemberType Определение
---- ---------- ----------
Метод CompareTo int CompareTo(System.Object obj), int CompareTo(логическое значение), int IComparable.CompareTo(Syst
Метод Equals bool Equals(System.Object obj), bool Equals(bool obj), bool IEquatable[bool].Equals(bool ot
Метод GetHashCode int GetHashCode()
GetType Тип метода GetType()
Метод GetTypeCode System.TypeCode GetTypeCode(), System.TypeCode IConvertible.GetTypeCode()
Метод ToBoolean bool IConvertible.ToBoolean (поставщик System.IFormatProvider)
ToByte Байт метода IConvertible.ToByte (поставщик System.IFormatProvider)
Метод ToChar char IConvertible.ToChar (поставщик System.IFormatProvider)
Метод ToDateTime datetime IConvertible.ToDateTime (поставщик System.IFormatProvider)
Десятичный метод ToDecimal IConvertible.ToDecimal (поставщик System.IFormatProvider)
Метод ToDouble double IConvertible.ToDouble (поставщик System.IFormatProvider)
Короткий метод ToInt16 IConvertible.ToInt16 (поставщик System.IFormatProvider)
Метод ToInt32 int IConvertible.ToInt32 (поставщик System.IFormatProvider)
Длинный метод ToInt64 IConvertible.ToInt64 (поставщик System.IFormatProvider)
Метод ToSByte sbyte IConvertible.ToSByte (поставщик System.IFormatProvider)
Метод ToSingle float IConvertible.ToSingle (поставщик System.IFormatProvider)
Строка метода ToString ToString(), строка ToString (поставщик System.IFormatProvider), строка IConvertible.To
Метод ToType System.Object IConvertible.ToType (тип convertType, System.провайдер IFormatProvider)
Метод ToUInt16 ushort IConvertible.ToUInt16 (поставщик System.IFormatProvider)
Метод ToUInt32 uint IConvertible.ToUInt32 (поставщик System.IFormatProvider)
Метод ToUInt64 ulong IConvertible.ToUInt64 (поставщик System.IFormatProvider)
Метод TryFormat bool TryFormat (System.Span [char] назначение, [ref] int charsWritten)
Строка SideIndicator NoteProperty SideIndicator===  

При использовании PassThru исходный тип объекта ( System.Boolean ). Обратите внимание, как вывод, отображаемый в формате по умолчанию для объектов System.Boolean , не отображал SideIndicator свойство. Однако возвращенный объект System.Boolean имеет добавленный ПримечаниеСвойство .

Пример 4. Сравнение двух простых объектов с использованием свойств

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

  Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -IncludeEqual

Индикатор стороны длины
------ -------------
     3 ==  

Пример 5. Сравнение сложных объектов с использованием свойств

В этом примере показано поведение при сравнении сложных объектов.В этом примере мы храним два разные объекты процесса для разных экземпляров PowerShell. Обе переменные содержат процесс объекты с таким же названием. Когда объекты сравниваются без указания свойства параметр, командлет считает объекты равными. Обратите внимание, что значение InputObject совпадает с результатом метода ToString() . Поскольку Класс System.Diagnostics.Process не имеет интерфейса IComparable , командлет преобразует объекты в строки, а затем сравнивает результаты.

  PS> Get-Process pwsh

 NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
 ------ ----- ----- ------ -- -- -----------
    101 123,32 139,10 35,81 11168 1 пвш
     89 107,55 66,97 11,44 17600 1 пвш

PS> $a = Get-Process-Id 11168
PS> $b = Get-Process-Id 17600
PS> $a.ToString()
Система.Диагностика.Процесс (pwsh)
PS> $b.ToString()
Система.Диагностика.Процесс (pwsh)
PS> Compare-Object $a $b -IncludeEqual

Индикатор стороны ввода объекта
----------- -------------
Система.Диагностика.Процесс (pwsh) ==

PS> Compare-Object $a $b -Property ProcessName, Id, CPU

Идентификатор ProcessName CPU SideIndicator
----------- --- -------------
pwsh 17600 11.4375 =>
pwsh 11168 36.203125 <=  

Когда вы указываете свойства для сравнения, командлет показывает различия.

Пример 6. Сравнение сложных объектов, реализующих IComparable

Если объект реализует IComparable , командлет ищет способы сравнения объектов.Если объекты имеют разные типы, объект Difference преобразуется в тип ReferenceObject затем сравнили.

В этом примере мы сравниваем строку с объектом TimeSpan . В первом случае строка преобразуется в TimeSpan , поэтому объекты равны.

  Объект сравнения ([TimeSpan]"0:0:1") "0:0:1" -IncludeEqual

Индикатор стороны ввода объекта
----------- -------------
00:00:01 ==

Объект сравнения "0:0:1" ([TimeSpan]"0:0:1")

Индикатор стороны ввода объекта
----------- -------------
00:00:01 =>
0:0:1 <=  

Во втором случае TimeSpan преобразуется в строку, поэтому объекты отличаются.

Параметры

- Чувствительный к регистру

Указывает, что сравнения должны быть чувствительны к регистру.

SwitchParameter
Положение: Название
False
Принять трубопроводный вход: False
Принять персональные знаки: False

- Культура

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

String
Должность: Должность
None
Принять трубопроводный вход: False
Принять подстановочные знаки: False

-РазницаОбъект

Указывает объекты, сравниваемые с эталонными объектами .

0
Тип: Psobject []
Должность: 1
None
None
Принять трубопроводный вход: True
Принять подстановочные знаки: Ложь

-ExcludeDifferent

Указывает, что этот командлет отображает только одинаковые характеристики сравниваемых объектов.То различия между объектами отбрасываются.

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

Если ExcludeDifferent указано без IncludeEqual , вывод невозможен.

SwitchParameter
Положение: Название
False
Принять трубопроводный вход: False
Принять персональные знаки: False

-IncludeEqual

IncludeEqual отображает совпадения между эталонными и разностными объектами.

По умолчанию выходные данные также включают различия между эталоном и разницей . объекты.

SwitchParameter
Положение: Название
False
Принять трубопроводный вход: False
Принять персональные знаки: False

-Проходной

При использовании параметра PassThru Compare-Object пропускает оболочку PSCustomObject вокруг сравниваемых объектов и возвращает отличающиеся объекты без изменений.

SwitchParameter
Положение: Название
False
Принять трубопроводный вход: False
Принять персональные знаки: False

- Имущество

Задает массив свойств эталонных и разностных объектов для сравнения.

Значение параметра Свойство может быть новым вычисляемым свойством.Расчетное свойство может быть блоком скрипта или хеш-таблицей. Допустимые пары ключ-значение:

.
  • Выражение - <строка> или <блок скрипта>

Для получения дополнительной информации см. about_Calculated_Properties.

1
Тип: Объект [] Должность: Название Название
None
Принять трубопроводный вход: False
Ложь

-ReferenceObject

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

Тип: Psobject []
Должность: 0 0
None
Принять трубопроводный вход: FALSE
Принять подстановочные знаки: Ложь

-SyncWindow

Указывает количество смежных объектов, которые Compare-Object проверяет при поиске совпадений в коллекция объектов. Compare-Object проверяет соседние объекты, когда не находит объект на том же месте в коллекции. Значение по умолчанию — [Int32]::MaxValue , что означает, что Compare-Object проверяет всю коллекцию объектов.

При работе с большими коллекциями значение по умолчанию может быть неэффективным, но точным. Указание меньшего значения для SyncWindow может повысить производительность, но может снизить точность.

INT32
Положение: Название Название
[INT32] :: MaxValue
Принять трубопроводный вход: False
Принять символы подстановки : Ложь

Входы

PSОбъект

Вы можете отправить объект по конвейеру в параметр DifferenceObject .

Выходы

Нет

Если объект ссылки и объект разницы совпадают, вывод не производится, если вы используете параметр IncludeEqual .

PSCustomObject

Если объекты разные, Compare-Object заключает различающиеся объекты в PSCustomObject оболочка со свойством SideIndicator для ссылки на различия.

При использовании параметра PassThru Type объекта не изменяется, но экземпляр возвращаемого объекта имеет добавленный NoteProperty с именем SideIndicator . Боковой индикатор показывает, какому входному объекту принадлежит выход.

Примечания

При использовании параметра PassThru выходные данные, отображаемые в консоли, могут не включать SideIndicator свойство. Представление формата по умолчанию для вывода типа объекта с помощью Compare-Object не включает свойство SideIndicator .Для получения дополнительной информации см. пример 3 в этом статья.

Как сравнить два текстовых файла в Windows Powershell?

fc.exe лучше подходит для сравнения текста, поскольку он предназначен для работы как *nix diff, т. е. последовательно сравнивает строки, показывая фактические различия и пытаясь выполнить повторную синхронизацию (если разные разделы имеют разную длину). Он также имеет некоторые полезные параметры управления (текст/двоичный, чувствительность к регистру, номера строк, длина ресинхронизации, несоответствие размера буфера) и предоставляет статус выхода (-1 неверный синтаксис, 0 файлов одинаковых, 1 файл отличается, 2 файла отсутствуют).Будучи (очень) старой утилитой DOS, она имеет несколько ограничений. В частности, он не работает автоматически с Unicode, рассматривая 0 MSB символов ASCII как признак конца строки, поэтому файл становится последовательностью строк из 1 символа (@kennycoc: используйте параметр /U, чтобы указать, что ОБА файла являются Unicode, начиная с WinXP) ), а также размер буфера жесткой строки составляет 128 символов (128 байтов ASCII, 256 байтов Unicode), поэтому длинные строки разбиваются и сравниваются отдельно.

объект сравнения предназначен для определения того, являются ли два объекта идентичными по элементам.если объекты являются коллекциями, то они обрабатываются как НАБОРЫ (см. справку по сравнению с объектами), т. е. НЕУПОРЯДОЧЕННЫЕ коллекции без дубликатов. 2 набора равны, если они содержат одни и те же элементы независимо от порядка или дублирования. Это сильно ограничивает его полезность для сравнения текстовых файлов на наличие различий. Во-первых, поведение по умолчанию собирает различия до тех пор, пока не будет проверен весь объект (файл = массив строк), что приводит к потере информации о положении различий и сокрытию парных различий (и для SET отсутствует понятие номера строки). струн).Использование -synchwindow 0 приведет к тому, что различия будут выдаваться по мере их возникновения, но остановит попытку повторной синхронизации, поэтому, если в одном файле есть лишняя строка, последующие сравнения строк могут завершиться ошибкой, даже если в остальном файлы идентичны (до тех пор, пока не будет компенсационного дополнительную строку в другом файле, тем самым перестраивая совпадающие строки). Тем не менее, powershell чрезвычайно универсален, и с помощью этой функции можно выполнить полезное сравнение файлов, хотя и за счет значительной сложности и с некоторыми ограничениями на содержимое файлов.Если вам нужно сравнить текстовые файлы с длинными (> 127 символов) строками и где строки в основном совпадают 1: 1 (некоторые изменения в строках между файлами, но нет дублирования внутри файла, например, текстовый список записей базы данных, имеющих ключевое поле) затем, добавляя информацию в каждую строку, указывающую, в каком файле она находится, ее позицию в этом файле, а затем игнорируя добавленную информацию во время сравнения (но включая ее в вывод), вы можете получить * nix diff как вывод следующим образом (используются сокращения псевдонимов ):

  diff (gc file1 | % -begin { $ln1=0 } -process { '{0,6}<<:{1}' -f ++$ln1,$_ }) (gc file2 | % -begin { $ln2=0 } -process { '{0,6}>>:{1}' -f ++$ln2,$_ }) -property { $_.substring(9) } -passthru | сортировать | исходящая строка - ширина xx
  

где xx длина самой длинной строки + 9

Пояснение

  • (gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ }) получает содержимое файла и добавляет номер строки и индикатор файла (<< или >>) к каждой строке (используя оператор строки формата) перед передачей в diff.
  • -property { $_.substring(9) } указывает diff сравнивать каждую пару объектов (строк), игнорируя первые 9 символов (которые являются номером строки и индикатором файла).При этом используется возможность указать вычисляемое свойство (значение блока скрипта) вместо имени свойства.
  • -passthru заставляет diff выводить разные входные объекты (которые включают номер строки и индикатор файла) вместо разных сравниваемых объектов (которые не имеют).
  • sort-object затем возвращает все строки в последовательность.
    out-string останавливает усечение вывода по умолчанию, чтобы оно соответствовало ширине экрана (как заметил Марк Тауэрсап), указав ширину, достаточно большую, чтобы избежать усечения.Обычно этот вывод помещается в файл, который затем просматривается с помощью редактора с прокруткой (например, блокнота).

Примечание

Формат номера строки {0,6} дает выровненный по правому краю, дополненный пробелом 6-символьный номер строки (для сортировки). Если в файлах более 999 999 строк, просто измените формат на более широкий. Это также требует изменения параметра $_.substring (на 3 больше ширины номера строки) и значения xx внешней строки (максимальная длина строки + $_.подстрока параметра).

Как сравнить две папки в Windows Powershell?

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

  'папка1','папка2' | DiffFolders
  

Функция:

  Функция DiffFolders {
    Начинать {
        $последний = $NULL
    }
    Обработать {
        $текущий = @{}
        $ без изменений = 0
        
        $родитель = $_
        $parentPath = (Get-Item -Path $parent).$([regex]::escape($parentPath))"
        Get-ChildItem -Path $parentPath -Recurse -File `
        | %{
            $name = $_.FullName - заменить $parentRegex,''
            $current.Add($name, (Get-FileHash -LiteralPath $_.FullName).Hash)
            
            если (!$последний) {
                вернуть
            }
            
            если (!$last.Contains($name)) {
                [PSCustomObject]@{
                    родитель = $родитель
                    событие = «Добавлено»
                    значение = $имя
                }
                вернуть
            }
            
            если ($last[$name] -eq $current[$name]) {
                ++$ без изменений
            }
            еще {
                [PSCustomObject]@{
                    родитель = $родитель
                    событие = "Изменено"
                    значение = $имя
                }
            }
            $последний.Удалить ($ имя)
        }
        
        если ($последний) {
            [PSCustomObject]@{
                родитель = $родитель
                событие = 'Без изменений'
                значение = $ без изменений
            }
            $последний.Ключи `
            | %{
                [PSCustomObject]@{
                    родитель = $родитель
                    событие = 'Удалено'
                    значение = $_
                }
            }
        }
        
        $последний = $текущий
    }
}
  

Вот аккуратная демонстрация, которая должна быть на большинстве машин с Win10:

  PS C:\Program Files\WindowsApps> gci 'Microsoft.NET.Native.Runtime.*_x64__8wekyb3d8bbwe' | %{$_.Имя}
Microsoft.NET.Native.Runtime.1.7_1.7.25531.0_x64__8wekyb3d8bbwe
Microsoft.NET.Native.Runtime.1.7_1.7.27422.0_x64__8wekyb3d8bbwe
Microsoft.NET.Native.Runtime.2.1_2.1.26424.0_x64__8wekyb3d8bbwe
Microsoft.NET.Native.Runtime.2.2_2.2.27011.0_x64__8wekyb3d8bbwe
Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x64__8wekyb3d8bbwe
PS C:\Program Files\WindowsApps> gci 'Microsoft.NET.Native.Runtime.*_x64__8wekyb3d8bbwe' | %{$_.Имя} | Разные папки | Out-GridView
  

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

Также работает на Linux, для вас, пользователей powershell, запускающих его там 🙂

Для любопытных, неизмененными файлами были clrcompression.dll,logo.png , logo.png , logo.png и logo.png

Powershell: как сравнить два файла и вывести список различий |

Что делает командлет Compare-Object?

Командлет Compare-Object сравнивает два набора объектов.Один набор объектов является «эталонным набором», а другой набор является «разностным набором». Представленный ниже формат не будет сравниваться.

<= Это указывает на то, что значение свойства появляется только в наборе -ReferenceObject.
=> Указывает, что значение свойства отображается только в -differenceObject.
== Указывает, что оба значения свойства отображаются одинаково.

Пример:

В командлете Compare-Object есть два обязательных параметра — referenceObject и —differenceObject. Например, -referenceObject управляет основным содержимым, файлом, в котором хранится вся информация, а -differenceObject имеет вторичный файл.

Демо

Давайте создадим два файла, первый (Master & Child list) для справки, а второй для сравнения. Теперь мы готовы выполнить этот скрипт Compare-Object.

MasterList.txt

Арбуз
Виноград
Манго
Апельсины
Бананы
Огурец
Гува

Детский список.txt

Манго
Яблоко
Апельсины
Бананы
Огурец
Арбуз
Виноград

Пример 1. Сравнение двух файлов и перечисление их различий

Эта команда сравнивает содержимое двух текстовых файлов. Здесь Apple присутствует во втором файле (набор -differenceObject), а не в первом файле (набор -ReferenceObject), поэтому вывод будет => и Guva присутствует в первом файле, а не во втором файле, поэтому вывод будет <= .

Clear-Host $strReference = Get-Content "D:\BLOG\Power Shell\Examples\Masterlist.txt" $strDifference = Get-Content "D:\BLOG\Power Shell\Examples\ChildList.txt" Объект сравнения $strReference $strDifference

Clear-Host

$strReference = Get-Content "D:\BLOG\Power Shell\Examples\Masterlist.txt"

$strDifference = Get-Content "D:\BLOG\Power Shell\Examples\ChildList.txt "

Объект сравнения $strReference $strDifference

Пример 2: сравнение двух файлов с параметрами

Clear-Host $strReference = Get-Content "D:\BLOG\Power Shell\Examples\Masterlist.текст" $strDifference = Get-Content "D:\BLOG\Power Shell\Examples\ChildList.txt" Объект сравнения $strReference $strDifference -IncludeEqual Дополнительные параметры

Clear-Host

$strReference = Get-Content "D:\BLOG\Power Shell\Examples\Masterlist.txt"

$strDifference = Get-Content "D:\BLOG\Power Shell\Examples\ChildList.txt "

Объект сравнения $strReference $strDifference -IncludeEqual

 

Дополнительные параметры

Дополнительные параметры
- с учетом регистра Это указывает на то, что сравнения должны быть чувствительны к регистру.
- Культура Указывает язык и региональные параметры для сравнения.
- Собственность Задает массив свойств эталонного и разностного объектов для сравнения.
-ExcludeDifferent Указывает, что этот командлет отображает только те характеристики сравниваемых объектов, которые равны
-SyncWindow Указывает количество смежных объектов, которые проверяет этот командлет при поиске совпадений в коллекции объектов.
-IncludeEqual Указывает, что этот командлет отображает одинаковые характеристики сравниваемых объектов. По умолчанию отображаются только те характеристики, которые различаются между эталоном и разными объектами.
-Проходной Возвращает объект, представляющий элемент, с которым вы работаете. По умолчанию этот командлет не создает никаких выходных данных.

 

ПРИМЕЧАНИЕ. Если набор ссылок или набор разностей равен нулю ($null), Compare-Object генерирует завершающую ошибку.

 

Что вы думаете?

Надеюсь, у вас есть представление о том, как использовать командлет PowerShell Compare-Object. Я хотел бы получить обратную связь от читателей моего поста. Ваши ценные отзывы, вопросы или комментарии по поводу этой статьи всегда приветствуются.

Сравнение двух файлов с помощью PowerShell

Одной из концепций, о которых мы снова и снова писали в этом блоге, является принцип определения исходного уровня и того, как сравнивать текущее состояние системы с заведомо исправным снимком того же атрибута системы.Если, например, сегодня у нас есть сервер с 10 запущенными службами, а завтра мы проверим систему и обнаружим, что запущено 11 служб, значит, что-то не так. Говоря бессмертными словами «Улицы Сезам»: «Одна из этих вещей не похожа на другую. Одна из этих вещей не одно и то же…»

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

Если вы работаете с системой Unix/Linux, вам обязательно понадобится надежная утилита DIFF. Он существует уже много лет и является фаворитом системного администратора.

Однако с Microsoft PowerShell мы должны принять решение.Двоичный файл DIFF недоступен в PowerShell (хотя есть псевдоним DIFF). Однако есть две команды, встроенные в Windows и доступные со времен CMD.EXE. Эти две встроенные команды — FC.EXE и COMP.EXE. К сожалению, оба они, как правило, ненадежны и дают странные результаты при использовании их для базовой линии. Итак, что еще мы можем сделать?

К счастью, в PowerShell появился командлет COMPARE-OBJECT (и да, как вы уже догадались, DIFF — это псевдоним для этого командлета).С помощью PowerShell вы можете взять два объекта, передать их в COMPARE-OBJECT, и он даст вам сравнение между двумя объектами. Этими объектами может быть что угодно, но для наших целей мы сосредоточимся на текстовых файлах. Но ничего не говорит о том, что вы не можете сравнивать учетные записи пользователей из Active Directory, ключей реестра или любых других объектов.

Синтаксис команды:

 Объект сравнения объект1 объект2
 

Однако есть один нюанс. Если таким образом сравнить два текстовых файла, командлет просто скажет: «Да, имя текстового файла file1.txt и file2.txt разные». Поэтому, если вы хотите сравнить содержимое двух текстовых файлов, необходимо сделать дополнительный шаг. Вы должны ввести командлет GET-CONTENT, чтобы сравнить содержимое двух файлов. Поэтому новый (и пригодный для использования) синтаксис будет работать так:

.
 Объект сравнения (get-content file1.txt) (get-content file2.txt)
 

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

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

).

Использование параметра сравнения файлов PowerShell для обнаружения различий в файлах

Три раза в неделю (понедельник/среда/пятница) Джон Сэвилл отвечает на ваши самые насущные вопросы в области ИТ.

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

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


В. Как сравнить два файла с помощью PowerShell?

А . В PowerShell есть командлет Compare-Object. Он сравнивает объекты, и эти объекты могут включать в себя массив текста.Чтобы сравнить два файла, вы можете прочитать файл, а затем сравнить. Например, приведенная ниже команда запускает процесс сравнения файлов PowerShell для содержимого двух файлов и показывает все различия:

.

Compare-Object (получение содержимого D:\Temp\NPS\manualexport5dec_nps2.xml) (получение содержимого D:\Temp\NPS\manualexport5dec_nps1.xml)

Ниже приведен пример исполнения:

InputObject SideIndicator
----------- -------------
=>
<=


В.Как показать результаты PowerShell, за исключением результатов, содержащих определенную строку?

А . Недавно я получил несколько ответов, и мне нужно удалить все записи, содержащие определенную строку. К счастью, это очень просто сделать с помощью оператора -notmatch. Например:

Get-ADOrganizationalUnit -LDAPFilter "(Name=$OUName)" | где {$_.DistinguishedName - не соответствует "EXP"}

В этом примере возвращаются все OU, которые имеют имя переменной $OUName.Затем каждое из них передается на следующую строку, которая проверяет отличительное имя OU, и если это отличительное имя OU содержит EXP, оно не будет передано по конвейеру. Этот подход может быть использован для действительно любого типа сравнения.


В. В сценариях PowerShell я иногда вижу % после вертикальной черты. Что это делает?

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

.

процесс получения | ForEach-Object { если ($_.ЦП -ge 10) {$_.name}}

Получает список всех процессов, затем для каждого объекта процесса, если время потребления ЦП больше или равно 10, его имя передается по конвейеру.

Вы можете сократить это до:

процесс получения | % { если ($_.CPU -ge 10) {$_.name}}

% — это просто псевдоним ForEach-Object (вы также можете написать ForEach).

.

Добавить комментарий

Ваш адрес email не будет опубликован.