亀の甲羅2

今日もまた朝とく起きて励まなん窓に明るきありあけの月

powershell : ps2exe の使い方(コマンドライン)

ps1ファイルをExe変換するツール。GUIツールもあるが、powershellコンソールからも実行できる。
Invoke-ps2exeまたは、ps2exeを使用する。

Invoke-ps2exe -inputFile .\source.ps1 -outputFile .\target.exe -noConsole

-noConsole は黒いコンソール画面を表示させないオプション。
その他のオプションは、下記を参照。

github.com

powershell ファイル削除 (ゴミ箱未使用パターン / ゴミ箱使用パターン)

ゴミ箱未使用

Remove-Item -Path "hogehoge.txt"

これは、いつも通り。

ゴミ箱使用

$shell = New-Object -ComObject "Shell.Application"
$recycleBin = $shell.Namespace(0xA)
$recycleBin.MoveHere("hogehoge.txt")

NameSpace(0xA)の0xAは、ShellSpecialFolderConstantsの値で、Windowsのごみ箱を指します。
とのことです。Bingちゃんが教えてくれた。

powershell 正規表現 最小マッチ(「.*」 を使ったときに)

.* を使うと任意の文字を0回以上繰り返す。置換などで正規表現を使う場合、思わぬところまでマッチしてしまうことがある。
最大マッチ、最小マッチの概念がある。

$str = "aaa-bbb-ccc.jpg"

$str -replace "^.*-", "hoge-"  # hoge-ccc.jpg(普通に.*を使うと最大マッチ:aaa-bbb-の部分にマッチ)
$str -replace "^.*?-", "hoge-"  # hoge-bbb-ccc.jpg(.*?を使うと最小マッチ:aaa-の部分にマッチ)

こんな感じで、最大マッチ、最小マッチで結果が異なる。

powershell 配列同士の比較(差分取得)

$a = @("a", "b", "c");
$b = @("d", "b", "v");


Write-Host "---- same ----"
$same = Compare-Object $a $b -IncludeEqual -ExcludeDifferent | Select-Object -ExpandProperty InputObject
$same


Write-Host "---- diff ----"
$diff = Compare-Object $a $b | Select-Object -ExpandProperty InputObject
$diff

Write-Host "---- $a-$b ----"
$diff = Compare-Object $a $b | Where-Object {$_.SideIndicator -eq "<="} | Select-Object -ExpandProperty InputObject
$diff

Write-Host "---- $b-$a (1) ----"
$diff = Compare-Object $b $a | Where-Object {$_.SideIndicator -eq "<="} | Select-Object -ExpandProperty InputObject
$diff

Write-Host "---- $b-$a (2) ----"
$diff = Compare-Object $a $b | Where-Object {$_.SideIndicator -eq "=>"} | Select-Object -ExpandProperty InputObject
$diff

Select-Object -ExpandProperty InputObjectが分からなかったので、Bingちゃんに聞いてみたところ下記の回答。

Select-Object -ExpandProperty InputObjectは、Select-Objectコマンドレットを使用して、InputObjectプロパティを展開しています。
-ExpandPropertyパラメーターは、指定されたプロパティの値を展開し、その値を出力します。

この場合、Compare-Objectコマンドレットの出力には、InputObjectプロパティが含まれており、その値が配列の要素です。
Select-Object -ExpandProperty InputObjectを使用することで、配列の要素だけが出力されます。

受信したメッセージ. Select-Object -ExpandProperty InputObjectは、Select-Objectコマンドレットを使用して、
InputObjectプロパティを展開しています。-ExpandPropertyパラメーターは、指定されたプロパティの値を展開し、
その値を出力します。 この場合、Compare-Objectコマンドレットの出力には、InputObjectプロパティが含まれており、
その値が配列の要素です。Select-Object -ExpandProperty InputObjectを使用することで、配列の要素だけが出力されます。

---- same ----
b
---- diff ----
d
v
a
c
---- a b c-d b v ----
a
c
---- d b v-a b c (1) ----
d
v
---- d b v-a b c (2) ----
d
v

powershell Linux のtail -f と同じようにファイル(ログ)監視をしてみる

ログ監視って結構使いますよね。Windowsではどうやるんだ?と思い調べてみた。

Get-Content -Path xxxx\hogehoge.log -Wait

-Waitをつけると、監視モードになり、hogehoge.logが更新されるとその差分がターミナル上に追記されていく。
動きの速いログでないかぎり、この方法でtail -fと同等の使い方が出来そうです。

ただ、Get-Contentは読み取り専用でファイルを開きますが、そのアクセス中だけは、他のプロセスが当該ファイルを排他的に(占有)ひらくことはできないらしいです。
Bingちゃんが教えてくれました。

powershell メッセージボックスを表示する

一番単純なメッセージボックスは下記の通り。デフォルトでOKボタンは表示される。

Add-Type -AssemblyName System.Windows.Forms

[System.Windows.Forms.MessageBox]::Show("I Love you  so ...")

Showメソッドを調べれば、引数はほかにもある。

Add-Type -AssemblyName System.Windows.Forms

$Message = "I Love You So ...";
$title = "title"

$ButtonType = [System.Windows.MessageBoxButton]::OK
$MessageIcon = [System.Windows.MessageBoxImage]::Information

[System.Windows.MessageBox]::Show($Message, $Title, $ButtonType, $MessageIcon) | Out-Null