2011年2月25日

今日 PowerShell で dll のアイコンを指定しようとして困ったこと。

ショートカットを作る PowerShell を書いてて、アイコンを指定しようと思った。

ふつうは、ico ファイルとか exe をそのまま指定するんだけろうけど、
今回は %SystemRoot%\system32\SHELL32.dll の中のアイコンを指定したかった。

ググりかたすらわからなかったけど、ひょんなことから発見。

"%SystemRoot%\system32\SHELL32.dll,-1"

とかで指定できるみたい。

これで安泰!と思いきや、欲しいアイコンの数字を指定してもアイコンが白いまま。

で、ためしに「-」を取ってみたらできた。

"%SystemRoot%\system32\SHELL32.dll,265"

アイコンの番号は、左上から右下に向かって 1 づつ増える。
数えるのが面倒だけど。

あと、「-」はつけなくてもいいみたい。
一応、54 まではつけてもうごくみたいだけど。(Windows 7 Home Premium 64-bit にて)


ちなみに、ショートカット作るには以下のコマンドを PowerShell で実行すれば OK

$wsh = New-Object -comObject WScript.Shell
$link = $wsh.CreateShortcut("C:\Users\Public\Desktop")
$link.TargetPath = "C:\Windows\notepad.exe"
$link.WorkingDirectory = "C:\Windows\"
$link.IconLocation = "C:\Windows\notepad.exe"
$link.Save()

ショートカットの引数は Save() を呼び出す前に以下の値を指定すれば OK
$link.Arguments = "なんちゃら"

2011年2月24日

今日 PowerShell で困ったこと。 -> Set-ExecutionPolicy の x86 と x86_64

PowerShell スクリプトを書いてて、ps1 ファイルの実行で困った。


ps1 ファイルはダブルクリックでは実行できなくて
powershell コマンドの引数とかで実行してやる必要がある。


この時、デフォルトではスクリプトの実行が制限されていて、
Set-ExecutionPolicy を RemoteSigned などに変更する必要がある。


http://www.atmarkit.co.jp/fwin2k/win2ktips/1023ps1sec/ps1sec.html


しかし、いくら変えたところで一向に Restricted から変わらない。
もちろん、管理者権限で PowerShell を起動している。

64bit 環境の PowerShell では、x86 版(上)と x86_64 版(下)の 2 つの PowerShell が存在する。


Windows PowerShell (x86) -> %SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe
Windows PowerShell -> %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe


この時、それぞれの PowerShell で Set-ExecutionPolicy の値は共有されてなく、別々に保存されている。


環境がある場合、片方だけ変えてみると、もう片方が変わらないことが確かめられる。

なので、PowerShell スクリプトを動かしたい場合は、 
 x86 と x86_64 の両方で Set-ExecutionPolicy RemoteSigned してあげると幸せ☆