PowerShell の隠された機能は何ですか?
私を答えに移して、これをcommwikiにするのは悪くないと思います。
Foreachループ:
PS C:\> foreach ($a in "a","b","c") { write $a }
a
b
c
UNCパスへのChangedir:
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
[...]
Powershell関数を強制的に本当に配列を返します。空の配列であっても返します。
@()構文の実装方法により、関数は常に期待どおりに配列を返すとは限りません。次のコードは$ nullと[〜#〜] not [〜#〜]空の配列を返します。 _set-StrictMode -On
_が設定されたコードをテストしている場合、_.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
_
独自のカスタム関数を作成し、プロファイルに保存します。同様の問題が発生するたびに考え直すことなく、たくさんの便利な関数を作成できます。
プロファイルを編集します。
PS C:\> notepad $profile
アセンブリ名で_Add-Type -Assembly
_を使用するか、dllパスで_Add-Type -Path
_を使用し、[Namespace.Dotted.ClassName+NestedClass]::StaticMethod()
などの構文を使用して_New-Object Namespace.Dotted.ClassName
_を作成するか、呼び出して、.netクラスにアクセスします。型の静的メソッド/フィールド。
ISEのUTF-16とは異なるエンコーディングを使用してファイルを保存します。
Powershell ISEは、デフォルトですべてのファイルを「Unicodeビッグエンディアン」(UTF-16)エンコーディングとして保存します。次のコードは、ISEにメニュー項目を作成し、ホットキー(デフォルト、Ctrl-Shift + E)を割り当てて、UTF-16以外の指定されたエンコーディングを使用して現在の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ファイルをプレーンテキストではなくバイナリとしてリポジトリに追加します。スクリプトが「バイナリ」であるためにスクリプトを「差分」できないか、ファイルを追加できないというエラーを生成します。 「バイナリmimeタイプ」だからです。エンコーディングをUTF-8に変更すると、ファイルをsvn:mime-type/text-plainを使用してリポジトリに追加できるようになり、diff関数が機能するようになります。
Set-AuthenticodeSignatureを使用したコードの署名は、一部のファイルでは失敗し、他のファイルでは失敗しません
おそらく他のケースは、ファイルコンテンツ操作が一部のファイルに対して機能し、他のファイルに対しては機能しないことでした。多くの場合、明らかな理由はありませんが、1つの症状は、ISEで作成されたファイルのみに問題があることです。
飛び散る。ハッシュテーブルで一連の引数を定義し、それを関数のパラメーターとして使用できます。
$sendMailParameters = @{
To = '[email protected]'
From ='[email protected]'
Subject = 'Something'
Body = 'Some stuff'
BodyAsHtml = $true
}
Send-MailMessage @sendMailParameters
これは明らかではない面倒ですが、私はかつて、Checkpointファイアウォールで使用される古い実行可能ファイルofiller.exeの入力としてCSVファイルを生成するスクリプトを作成しました。
私は出力リダイレクトを使用していました:Script.ps1 > outfile.csv
PowerShellで作成したCSVファイルが機能しませんでした。2つのファイルが同じように異なっていても、手書きのテストCSVファイルは正常に機能しました。ファイルのサイズを調べたときだけ、それがUnicode Vs ASCIIの問題であることがわかりました。PowerShellCSVは2倍の大きさでした。
安価で陽気なSTDOUTリダイレクトではなく、出力を| Out-File -format ASCII -name outfile.csv
にパイプすることで問題が解決しました。