PowerShell的隐藏function

PowerShell的隐藏function是什么?

强制Powershell函数真正返回一个数组,甚至是一个空数组。

由于@()语法的实现方式,函数可能并不总是按照预期返回数组,例如下面的代码将返回一个$ null而不是一个空的数组。 如果您正在使用set-StrictMode -Ontesting代码,则在尝试引用.count属性时,您将收到PropertyNotFoundStrict错误:

 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 

制作您自己的自定义function并将其保存在您的个人资料中 您可以创build大量有用的function,而不必在每次出现类似问题时都重新考虑。

编辑您的个人资料:

 PS C:\> notepad $profile 

通过使用具有程序集名称的Add-Type -Path或具有dllpath的Add-Type -Path来访问任何.NET类,然后使用类似[Namespace.Dotted.ClassName+NestedClass]::StaticMethod()语法来创buildNew-Object Namespace.Dotted.ClassName或调用types上的静态方法/字段。

在ISE中使用不同于UTF-16的编码保存文件。

Powershell ISE默认将所有文件保存为“Unicode Big Endian”(UTF-16)编码。 以下代码将在ISE中创build一个菜单项,并使用UTF-16以外的指定编码分配一个热键(默认为Ctrl-Shift + E),以保存当前PowerShellISE选项卡中的文件。 我把它设置为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文件作为二进制文件添加到存储库,而不是纯文本,不会让您“脚本化”您的脚本,因为它们是“二进制”,或者生成一个文件无法添加的错误因为它是“二进制MIMEtypes”。 将编码更改为UTF-8应允许使用svn:mime-type / text-plain将文件添加到存储库,并允许diff函数工作。

  • 使用set-AuthenticodeSignature对一些文件签名代码失败,而不是其他文件

  • 其他情况下,文件内容操作可能适用于某些文件,而不是其他文件,通常没有明显的原因,但有一个症状是只有使用ISE创build的文件才有问题。

泼溅。 你可以在Hashtable中定义一堆参数,然后用它作为函数的参数。

 $sendMailParameters = @{ To = '[email protected]' From ='[email protected]' Subject = 'Something' Body = 'Some stuff' BodyAsHtml = $true } Send-MailMessage @sendMailParameters 

把我的答案搬到一个答案,所以我不觉得这使得这是一个联合撰写。

Foreach循环:

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

将Changedir更改为UNCpath:

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

获取运行服务:

PS C:> get-service | 其中{$ _。status -eq“running”}

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

这更不是一个明显的麻烦,但是我曾经写过一个脚本来生成一个CSV文件作为一个旧的可执行文件ofiller.exe的input,该文件与Checkpoint防火墙一起使用。

我正在使用输出redirect: Script.ps1 > outfile.csv

我的PowerShell创build的CSV文件不起作用,我的手写testingCSV文件工作正常,即使这两个文件差异相同。 只有当我看到文件的大小,我才意识到这是一个Unicode Vs ASCII的问题; PowerShell CSV是两倍大。

将我的输出configuration为| Out-File -format ASCII -name outfile.csv | Out-File -format ASCII -name outfile.csv代替廉价而欢快的STDOUTredirect解决了这个问题。