64bit OSで【32bitアプリケーション】を使用し、その【32bitアプリケーション】からpowershell_ISE(64bit版)を起動する。-replace 【32bitアプリケーション】, あふw(x86)
Powershell_ISE
64bit OS(Windows10や11)でpowershell_ISEを起動する。
通常①が起動される。
64bit OSで【32bitアプリケーション】を使用し、その【32bitアプリケーション】からpowershell_ISEを起動する。
パスは「%windir%\system32\WindowsPowerShell\v1.0\PowerShell_ISE.exe」として64bitのpowershell_ISEを起動しようとする。
しかし②にリダイレクトされて32bit向けのpowershell_ISEが起動する。
64bit OSで【32bitアプリケーション】を使用し、その【32bitアプリケーション】からpowershell_ISEを起動する。
パスは「%windir%\Sysnative\WindowsPowerShell\v1.0\PowerShell_ISE.exe」としてpowershell_ISEを起動しようとする。
①にリダイレクトされて64bit向けのpowershell_ISEが起動する。
①64bitアプリケーション %windir%\system32\WindowsPowerShell\v1.0\PowerShell_ISE.exe ②32bitアプリケーション(32bitアプリ―ションではこちらにリダイレクトされる) %windir%\syswow64\WindowsPowerShell\v1.0\PowerShell_ISE.exe ③32bitアプリケーションから64bitアプリケーションを指定して起動する仮想パス(64bitアプリからこのパスにアクセスするとパス無となる) %windir%\Sysnative\WindowsPowerShell\v1.0\PowerShell_ISE.exe
【32bitアプリケーション】を「あふ w(x86)」(http://akt.d.dooo.jp/akt_afxw.html) と読み替えてもらえば、私のやりたかったことが分かる。
「あふ w(x86)」からmnuやkeyファイルでpowershell_ISEを起動しているが、普通の起動の仕方をすると32bit版のpowershell_ISE(x86)
が起動する。
絶対パスで64bit版のpowershell_ISEを指定しても32bit版が起動してしまう。この対処方法を探ってみた。
32bitアプリケーションからのみアクセス可能な仮想パス「%windir%\Sysnative\」を使用することで64bitのアプリケーションを指定できる。
※「あふ w(x64)」を使用すれば上記のような考慮は全く不要だが、ある環境で「あふ w(x64)」が起動できないので、仕方なく32bit版のあふwを使用している。
powershell : ps2exe の使い方(コマンドライン)
ps1ファイルをExe変換するツール。GUIツールもあるが、powershellコンソールからも実行できる。
Invoke-ps2exeまたは、ps2exeを使用する。
Invoke-ps2exe -inputFile .\source.ps1 -outputFile .\target.exe -noConsole
-noConsole は黒いコンソール画面を表示させないオプション。
その他のオプションは、下記を参照。
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-の部分にマッチ)
こんな感じで、最大マッチ、最小マッチで結果が異なる。
別の例を出しましょう。
# サンプルURL $tmp = "http://example.com/some/path" # 正規表現を使って最長一致でhttpから/までを置換 $tmp = $tmp -replace "http.*\/", ""
正規表現の.*\/部分が貪欲にマッチし、httpから最長の/までをマッチさせます。
# サンプルURL $tmp = "http://example.com/some/path" # 正規表現を使って最短一致でhttpから最初の/までを置換 $tmp = $tmp -replace "http.*?\/", ""
この結果、$tmpの内容は"example.com/some/path"になります。
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