Скрытые возможности PowerShell

Каковы скрытые возможности PowerShell?

7 ответов

Решение

Переходя к ответу, чтобы я не чувствовал себя плохо, делая это comwiki.

Петли Фореха:

PS C:\> foreach ($a in "a","b","c") { write $a }
a
b
c

Изменен путь UNC:

PS C:\> cd \\kcws\c$
PS Microsoft.PowerShell.Core\FileSystem::\\kcws\c$>

Получите запущенные услуги:

PS C:> get-service | где {$_.status -eq "выполняется"}

Status Name DisplayName
------ ---- -----------
Running AeLookupSvc Application Experience
Running Appinfo Application Information
Running AudioEndpointBu... Windows Audio Endpoint Builder
Running Audiosrv Windows Audio
[...]

Заставить функции Powershell действительно возвращать массив, даже пустой массив.

Из-за способа реализации синтаксиса @() функции могут не всегда возвращать массив, как ожидалось, например, следующий код вернет $null, а НЕ пустой массив. Если вы тестируете код с set-StrictMode -On установить, вы получите PropertyNotFoundStrict вместо этого ошибка при попытке сослаться на .count имущество:

function test
{
    #some code that might return none,one or multiple values
    $data = $null
    return @($data)
}
(test).count

Просто добавляешь , к @() пропустит "синтаксический сахар", и вы получите реальный массив, даже если он пустой:

function test2
{
    #some code that might return none,one or multiple values
    $data = $null
    return ,@($data)
}
(test2).count

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

Редактировать профиль:

PS C:\> notepad $profile

Доступ к любым классам.net с помощью Add-Type -Assembly с названием сборки или Add-Type -Path с путем DLL, а затем с помощью синтаксиса, как [Namespace.Dotted.ClassName+NestedClass]::StaticMethod() создать New-Object Namespace.Dotted.ClassName или вызовите статические методы / поля для типов.

Сохраняйте файлы, используя другую кодировку, чем UTF-16 в ISE.

По умолчанию Powershell ISE сохраняет все файлы в кодировке "Unicode Big Endian" (UTF-16). Следующий код создаст пункт меню в ISE и назначит горячую клавишу (по умолчанию, Ctrl-Shift+E) для сохранения файла на текущей вкладке PowerShellISE с использованием указанной кодировки, отличной от UTF-16. Я установил его в UTF-8, но вы можете использовать ASCII или что-то еще, если хотите.


$iseProfile = $profile -replace '_profile','ISE_profile'
$addMenuCmdStr = '$psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add("_Save as UTF8",{$psIse.CurrentFile.Save([System.Text.Encoding]::UTF8)},"Ctrl+Shift+E")'
add-content $iseProfile -value $addMenuCmdStr 
ise

Этот прием полезен для избежания определенных проблем со сценариями PowerShell, таких как:

  • Subversion (возможно, другие системы CVS) добавляет файлы.ps1 в хранилище в виде двоичного файла, а не в виде обычного текста, не позволит вам "различать" ваши сценарии, поскольку они являются "двоичными", или выдает ошибку, что файл не может быть добавлен потому что это "бинарный MIME-тип". Изменение кодировки на UTF-8 должно позволить вашим файлам быть добавленными в хранилище с помощью svn:mime-type/text-plain и позволить функциям diff работать.

  • Подписание кода с использованием set-AuthenticodeSignature завершается ошибкой для некоторых файлов, а не для других

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

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

$sendMailParameters = @{
    To = 'someone@somebody.com'
    From  ='someone@somebody.com'
    Subject = 'Something'
    Body = 'Some stuff'
    BodyAsHtml = $true
}

Send-MailMessage @sendMailParameters

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

Я использовал перенаправление вывода: Script.ps1 > outfile.csv

Мой созданный PowerShell CSV-файл не работал, где мой рукописный тестовый CSV-файл работал нормально, хотя эти два файла различались одинаково. Только когда я посмотрел на размер файлов, я понял, что это проблема Unicode Vs ASCII; CSV PowerShell был в два раза больше.

Передача моего вывода в | Out-File -format ASCII -name outfile.csv вместо дешевого и веселого перенаправления STDOUT проблема решена.

Другие вопросы по тегам