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 してあげると幸せ☆

2011年1月21日

今日 sudo で困ったこと。 -> php: command not found

こないだの cron に引き続き、今度は sudopath で引っかかった。

どうやら、sudo では実行ユーザの path が引き継げないようだ。

http://mkosaki.blog46.fc2.com/blog-entry-792.html
http://d.hatena.ne.jp/japanrock_pg/20090527/1243426081

↓を .bashrc とか動かしたいシェルに貼り付けてあげる。

export PATH=/usr/local/bin:$PATH
alias sudo="sudo env PATH=$PATH"
これとりあえず path が通るけど、一番いい方法はなんなのか考えてみると面白そうかも。

2011年1月19日

今日困ったこと2。-> ssh: command not found

cron でスクリプトを回してて、外部のサーバに ssh でコマンドをたたきたかった。

普段の zsh では問題なく動くのに、cron だとコマンドが見つからない。

ssh が動くのに、見つからないってことはパスが通ってないと考えた。

でも、どこのパス?っていう疑問で考えたのが /bin/sh のパス。

シェルスクリプトの頭に

#!/bin/sh

を書いていたから、sh でパスが通ってないのかとおもったけど、どうもそうではなかった。

sh-3.2$ which ssh
/usr/local/bin/ssh
sh-3.2$ echo $PATH
/usr/kerberos/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/java/jdk/bin:/usr/local/java/ant/bin:/usr/local/java/javacc/bin:/usr/local/java/jflex/bin


そうなると、シェルスクリプトの呼び出し元が怪しいので、crontab を調べることに。

パスが設定できることを思い出し、crontab がデフォルトで設定するパスを調べる。

sh-3.2$ cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

うん、見事にパスが通ってない。

原因がわかったので、自分の crontab にパスを通す。

sh-3.2$ crontab -e

PATH=/sbin:/bin:/usr/sbin:/usr/bin

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin


これでようやっと cron で ssh コマンドを実行することができた。

今日困ったこと1。 -> (13)Permission denied: access to * denied

Apache いじってて 403 Forbidden が出てしょんぼり(´・ω・`)

Alias を conf ファイルに以下のような感じで書いてた。

Alias /nananeko /home/nananeko/public_html


ちょっと訳あって UserDir は使えない環境。

調べてみてわかったことは、

1. SELinux が無効化されていない可能性
2. /home/your のパーミッションが 700 の可能性

ということらしい。ほかにもあるかも。

自分の環境では SELinux は最初に無効化するので、可能性から除外。

2 をあたってみると、見事に 700 だったので、755 へ変えてアクセスできるようになった。