[powershell-v2.0] Сравнение переменных массива в PowerShell. Сравнение powershell


PowerShell Сравните содержимое двух строк

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

Пример:

$Var1 = "item1" $Var1 += "item2" $Var2 = "item2" $Var2 = "item1"

Как я могу сравнить эти две переменные чтобы убедиться, что оба они равны?

===== ОБНОВЛЕННЫЙ ПРИМЕР ===== ПРИМЕР: Получить объекты и отсортировать их.

$Computers = (Get-Content "$PWD\Computers.txt").GetEnumerator() | Sort-Object {"$_"}

ПРИМЕР: добавьте результаты и отсортируйте их.

$Successful += $Computer $Successful = $Successful.GetEnumerator() | Sort-Object {"$_"}

ПРИМЕР SCRIPT: Используется приведенные выше примеры для создания следующего сценария. Пример позволил мне проверить результаты, а не счет, но по содержанию, что позволило мне получить более точное сравнение. До того, как я использовал «Successful.count -eq Computers.count», который не проверял, был ли компьютер дважды введен.

$Computers = (Get-Content "$PWD\Computers.txt").GetEnumerator() | Sort-Object {"$_"} $HotFixes = Get-Content "$PWD\HotFixes.csv" CLS While (!$Successful -OR $Successful -ne $Computers) { foreach ($Computer in $Computers) { $MissingCount = 0 IF (!$Successful -NotLike "*$Computer*") { Write-Host "$Computer`: Connecting" If (Test-Connection -ComputerName $Computer -Count 1 -quiet) { Write-Host "$Computer`: Connected" [string]$Comparison = get-hotfix -ComputerName $Computer | Select -expand HotFixID ForEach ($HotFix in $HotFixes) { IF ($Comparison -NotLike "*$HotFix*") { $Results += "$Computer,$HotFix" $MissingCount++ } } Write-Host "$Computer`: $MissingCount Patches Needed" $Successful += $Computer $Successful = $Successful.GetEnumerator() | Sort-Object {"$_"} } ELSE { Write-Host "$Computer`: Unable to connect" } } ELSE { Write-Host "$Computer already completed" } Write-Host "$Computer`: Complete" Write-Host } } $Results

powershell powershell-v2.0 powershell-v1.06,258

stackoverrun.com

powershell - Сравнение переменных массива в 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, если он добавлен в boolean), поскольку Массив $firstFolder содержит System.IO.DirectoryInfo объекты, которые не совсем соответствуют массиву в переменной $secondFolder.

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

Compare-Object $firstFolder $secondFolder -SyncWindow 0

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

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

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

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

qaru.site

Использование Powershell для сравнения двух файлов, а затем вывод только разных имен строк

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

Чтобы дать некоторый контекст того, чего я пытаюсь достичь, я хотел бы иметь статический файл известных хороших процессов Windows ($ Authorized), и я хочу, чтобы мой скрипт вытащил список текущих запущенных процессов, колонку с именем процесса, чтобы просто потянуть строки имени процесса, затем сопоставить что-либо более одного символа, отсортировать файл по уникальным значениям и затем сравнить его с $ Authorized, плюс, наконец, либо вывести различные строки процесса, найденные в $ Processes (на выход ISE Pane) или просто для вывода различных имен процессов в файл.

Я провел сегодня, пытаясь найти решения в PowerShell ISE, а также Google Googling. Я слышал, что «fc» - лучший выбор вместо Compare-Object, но я не мог заставить это работать. Мне до сих пор удалось заставить его работать, но в финальной части, где он сравнивает два файла, которые, по-видимому, сравниваются по строкам, для которых всегда давались бы ложные срабатывания, так как позиция строк имен процессов в файле , кроме того, я хочу видеть только измененные имена процессов, а не номера строк, которые он сообщает («Процесс в строке 34 является выбросом» - это то, что в настоящее время выводится).

Надеюсь, это имеет смысл, и любая помощь в этом будет очень оценена.

Get-Process | Format-Table -Wrap -Autosize -Property ProcessName | Outfile c:\users\me\Desktop\Processes.txt $Processes = 'c:\Users\me\Desktop\Processes.txt' $Output_file = 'c:\Users\me\Desktop\Extracted.txt' $Sorted = 'c:\Users\me\Desktop\Sorted.txt' $Authorized = 'c:\Users\me\Desktop\Authorized.txt' $regex = '.{1,}' select-string -Path $Processes -Pattern $regex |% { $_.Matches } |% { $_.Value } > $Output_file Get-Content $Output_file | Sort-Object -Unique > $Sorted $dif = Compare-Object -ReferenceObject $(Get-Content $Sorted) -DifferenceObject $(get-content $Authorized) -IncludeEqual $lineNumber = 1 foreach ($difference in $dif) { if ($difference.SideIndicator -ne "==") { Write-Output "The Process at Line $linenumber is an Outlier" } $lineNumber ++ } Remove-Item c:\Users\me\Desktop\Processes.txt Remove-Item c:\Users\me\Desktop\Extracted.txt Write-Output "The Results are Stored in $Sorted"

stackoverrun.com

file - Сравнение папок и контента с PowerShell

Рекурсивный каталог Diff с использованием хеширования MD5 (сравнивает контент)

Вот чистый PowerShell v3 + рекурсивный файл diff (без зависимостей), который вычисляет хэш MD5 для каждого содержимого файлов каталогов (влево/вправо). Можно по желанию экспортировать CSV вместе с итоговым текстовым файлом. Результаты по умолчанию выводятся в стандартный вывод. Можно либо отбросить файл rdiff.ps1 в свой путь, либо скопировать содержимое в script.

USAGE: rdiff path/to/left,path/to/right [-s path/to/summary/dir]

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

######################################################################### ### USAGE: rdiff path/to/left,path/to/right [-s path/to/summary/dir] ### ### ADD LOCATION OF THIS SCRIPT TO PATH ### ######################################################################### [CmdletBinding()] param ( [parameter(HelpMessage="Stores the execution working directory.")] [string]$ExecutionDirectory=$PWD, [parameter(Position=0,HelpMessage="Compare two directories recursively for differences.")] [alias("c")] [string[]]$Compare, [parameter(HelpMessage="Export a summary to path.")] [alias("s")] [string]$ExportSummary ) ### FUNCTION DEFINITIONS ### # SETS WORKING DIRECTORY FOR .NET # function SetWorkDir($PathName, $TestPath) { $AbsPath = NormalizePath $PathName $TestPath Set-Location $AbsPath [System.IO.Directory]::SetCurrentDirectory($AbsPath) } # RESTORES THE EXECUTION WORKING DIRECTORY AND EXITS # function SafeExit() { SetWorkDir /path/to/execution/directory $ExecutionDirectory Exit } function Print { [CmdletBinding()] param ( [parameter(Mandatory=$TRUE,Position=0,HelpMessage="Message to print.")] [string]$Message, [parameter(HelpMessage="Specifies a success.")] [alias("s")] [switch]$SuccessFlag, [parameter(HelpMessage="Specifies a warning.")] [alias("w")] [switch]$WarningFlag, [parameter(HelpMessage="Specifies an error.")] [alias("e")] [switch]$ErrorFlag, [parameter(HelpMessage="Specifies a fatal error.")] [alias("f")] [switch]$FatalFlag, [parameter(HelpMessage="Specifies a info message.")] [alias("i")] [switch]$InfoFlag = !$SuccessFlag -and !$WarningFlag -and !$ErrorFlag -and !$FatalFlag, [parameter(HelpMessage="Specifies blank lines to print before.")] [alias("b")] [int]$LinesBefore=0, [parameter(HelpMessage="Specifies blank lines to print after.")] [alias("a")] [int]$LinesAfter=0, [parameter(HelpMessage="Specifies if program should exit.")] [alias("x")] [switch]$ExitAfter ) PROCESS { if($LinesBefore -ne 0) { foreach($i in 0..$LinesBefore) { Write-Host "" } } if($InfoFlag) { Write-Host "$Message" } if($SuccessFlag) { Write-Host "$Message" -ForegroundColor "Green" } if($WarningFlag) { Write-Host "$Message" -ForegroundColor "Orange" } if($ErrorFlag) { Write-Host "$Message" -ForegroundColor "Red" } if($FatalFlag) { Write-Host "$Message" -ForegroundColor "Red" -BackgroundColor "Black" } if($LinesAfter -ne 0) { foreach($i in 0..$LinesAfter) { Write-Host "" } } if($ExitAfter) { SafeExit } } } # VALIDATES STRING MIGHT BE A PATH # function ValidatePath($PathName, $TestPath) { If([string]::IsNullOrWhiteSpace($TestPath)) { Print -x -f "$PathName is not a path" } } # NORMALIZES RELATIVE OR ABSOLUTE PATH TO ABSOLUTE PATH # function NormalizePath($PathName, $TestPath) { ValidatePath "$PathName" "$TestPath" $TestPath = [System.IO.Path]::Combine((pwd).Path, $TestPath) $NormalizedPath = [System.IO.Path]::GetFullPath($TestPath) return $NormalizedPath } # VALIDATES STRING MIGHT BE A PATH AND RETURNS ABSOLUTE PATH # function ResolvePath($PathName, $TestPath) { ValidatePath "$PathName" "$TestPath" $ResolvedPath = NormalizePath $PathName $TestPath return $ResolvedPath } # VALIDATES STRING RESOLVES TO A PATH AND RETURNS ABSOLUTE PATH # function RequirePath($PathName, $TestPath, $PathType) { ValidatePath $PathName $TestPath If(!(Test-Path $TestPath -PathType $PathType)) { Print -x -f "$PathName ($TestPath) does not exist as a $PathType" } $ResolvedPath = Resolve-Path $TestPath return $ResolvedPath } # Like mkdir -p -> creates a directory recursively if it doesn't exist # function MakeDirP { [CmdletBinding()] param ( [parameter(Mandatory=$TRUE,Position=0,HelpMessage="Path create.")] [string]$Path ) PROCESS { New-Item -path $Path -itemtype Directory -force | Out-Null } } # GETS ALL FILES IN A PATH RECURSIVELY # function GetFiles { [CmdletBinding()] param ( [parameter(Mandatory=$TRUE,Position=0,HelpMessage="Path to get files for.")] [string]$Path ) PROCESS { ls $Path -r | where { !$_.PSIsContainer } } } # GETS ALL FILES WITH CALCULATED HASH PROPERTY RELATIVE TO A ROOT DIRECTORY RECURSIVELY # # RETURNS LIST OF @{RelativePath, Hash, FullName} function GetFilesWithHash { [CmdletBinding()] param ( [parameter(Mandatory=$TRUE,Position=0,HelpMessage="Path to get directories for.")] [string]$Path, [parameter(HelpMessage="The hash algorithm to use.")] [string]$Algorithm="MD5" ) PROCESS { $OriginalPath = $PWD SetWorkDir path/to/diff $Path GetFiles $Path | select @{N="RelativePath";E={$_.FullName | Resolve-Path -Relative}}, @{N="Hash";E={(Get-FileHash $_.FullName -Algorithm $Algorithm | select Hash).Hash}}, FullName SetWorkDir path/to/original $OriginalPath } } # COMPARE TWO DIRECTORIES RECURSIVELY # # RETURNS LIST OF @{RelativePath, Hash, FullName} function DiffDirectories { [CmdletBinding()] param ( [parameter(Mandatory=$TRUE,Position=0,HelpMessage="Directory to compare left.")] [alias("l")] [string]$LeftPath, [parameter(Mandatory=$TRUE,Position=1,HelpMessage="Directory to compare right.")] [alias("r")] [string]$RightPath ) PROCESS { $LeftHash = GetFilesWithHash $LeftPath $RightHash = GetFilesWithHash $RightPath diff -ReferenceObject $LeftHash -DifferenceObject $RightHash -Property RelativePath,Hash } } ### END FUNCTION DEFINITIONS ### ### PROGRAM LOGIC ### if($Compare.length -ne 2) { Print -x "Compare requires passing exactly 2 path parameters separated by comma, you passed $($Compare.length)." -f } Print "Comparing $($Compare[0]) to $($Compare[1])..." -a 1 $LeftPath = RequirePath path/to/left $Compare[0] container $RightPath = RequirePath path/to/right $Compare[1] container $Diff = DiffDirectories $LeftPath $RightPath $LeftDiff = $Diff | where {$_.SideIndicator -eq "<="} | select RelativePath,Hash $RightDiff = $Diff | where {$_.SideIndicator -eq "=>"} | select RelativePath,Hash if($ExportSummary) { $ExportSummary = ResolvePath path/to/summary/dir $ExportSummary MakeDirP $ExportSummary $SummaryPath = Join-Path $ExportSummary summary.txt $LeftCsvPath = Join-Path $ExportSummary left.csv $RightCsvPath = Join-Path $ExportSummary right.csv $LeftMeasure = $LeftDiff | measure $RightMeasure = $RightDiff | measure "== DIFF SUMMARY ==" > $SummaryPath "" >> $SummaryPath "-- DIRECTORIES --" >> $SummaryPath "`tLEFT -> $LeftPath" >> $SummaryPath "`tRIGHT -> $RightPath" >> $SummaryPath "" >> $SummaryPath "-- DIFF COUNT --" >> $SummaryPath "`tLEFT -> $($LeftMeasure.Count)" >> $SummaryPath "`tRIGHT -> $($RightMeasure.Count)" >> $SummaryPath "" >> $SummaryPath $Diff | Format-Table >> $SummaryPath $LeftDiff | Export-Csv $LeftCsvPath -f $RightDiff | Export-Csv $RightCsvPath -f } $Diff SafeExit

qaru.site

[powershell-v2.0] Сравнение переменных массива в 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 когда массивы не содержат различий.

code-examples.net

Сравнение объектов - Назначение PowerShell 2 Установка Windows PowesShell 6 Назначение PowerShell 7

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

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

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 остается необходимым лишь в тех ситуациях, где нет возможности использовать другой командлет.

1piar.ru

PowerShell сравнение двух файлов

Вопрос: Сравнение двух кривых

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

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

Что я делаю. Беру конкретную кривую с первого участка, помещаю ее в новую систему координат с началом в середине кривой (примерно). Перевожу координаты каждой точки кривой в новые координаты. То же самое с кривой со второго участка.

В итоге имеем два набора координат x,y. Соответственно каждый из этих наборов составляет кривую. Пусть наши кривые одинаковой длины (расстояния для обеих кривых от первой точки до последней равны). Кривые уже в одной системе координат, начала и концы кривых совмещены.

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

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

Ответ:

Сообщение от qillous

Но это немного перебор для моей работы.

Почему? Ведь аналог задачи: Некий цельный стержень из стекла. Разломили пополам, части откололись, остались две половинки.

Найти такие 6 неизвестных (координаты XYZ и 3 угла) одной половинки стержня чтобы их максимально приблизить. Удобно смотреть поверхности а не изолинии.

Сообщение от qillous

Сравнение идет не только по изолиниям, но и по многим другим фактором (как то магнитные аномалии, состав грунта и т.д.).

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

И вообще: тип грунта это например цвет поверхности точки, величина магнитного поля- прозрачность точки.Еще больше наглядность 3д модели. Аномалии состава грунта отличные метки для сопоставления. Можно выводить не всю карту а некие экстремумы точки.

Сообщение от qillous

перемещением обеих изолиний в относительные системы координат. Видимо не прав

Относительная система координат и будет у поверхности с наглядным профилем в 3д.

Сообщение от qillous

Перейти в полярную систему

Зачем? У вас 6 неизвестных, система координат тут не имеет значения обычно берут декартову.

Сообщение от qillous

Правда в моей случае только 2 оси.

Какие 2 оси? У вас координаты глубин. Т.е. 3 координаты, XY точки и Z глубина. Так и строить поверхность в 3д.

Сообщение от qillous

не очень представляю как его найти,

Пробовать разные запросы. Смотреть ссылки на что ссылается автор. Обычно книги поверхностно освещают и в них есть ссылки на исследования в которых детально описан метод. Глянуть книги по этой теме… Найти из какой области они. Попробовать поискать спец форумы узкой направленности по геологии или что это…

Сообщение от qillous

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

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

Сообщение от qillous

проще для конкретного участка,

Какого участка? Строите всю поверхность и смотрите в 3д. Если потянет комп или кусками.

Сообщение от qillous

чем каждый раз сравнивать руками, ведь так?)

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

forundex.ru