web-dev-qa-db-ja.com

PowerShellの隠された機能

PowerShell の隠された機能は何ですか?

6
tsilb

私を答えに移して、これを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
[...]
0
tsilb

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
_
4
Ryan Fisher

独自のカスタム関数を作成し、プロファイルに保存します。同様の問題が発生するたびに考え直すことなく、たくさんの便利な関数を作成できます。

プロファイルを編集します。

PS C:\> notepad $profile
2
KdgDev

アセンブリ名で_Add-Type -Assembly_を使用するか、dllパスで_Add-Type -Path_を使用し、[Namespace.Dotted.ClassName+NestedClass]::StaticMethod()などの構文を使用して_New-Object Namespace.Dotted.ClassName_を作成するか、呼び出して、.netクラスにアクセスします。型の静的メソッド/フィールド。

2
Jaykul

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で作成されたファイルのみに問題があることです。

1
Ryan Fisher

飛び散る。ハッシュテーブルで一連の引数を定義し、それを関数のパラメーターとして使用できます。

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

Send-MailMessage @sendMailParameters
1

これは明らかではない面倒ですが、私はかつて、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にパイプすることで問題が解決しました。

0
AndyN