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 проблема решена.