PowerShell の話ではあるんだけれど、むしろ「Windows System Internals」な話ではある。
MajiでPowerShellる5秒前ではちゃんと説明しなかったけれど、管理者モードで PowerShell 起動して
1 Set-ExecutionPolicy RemoteSigned
すれば「万事オッケーさ」ではないことは、初心者向けサイトに行けば書いてある。たとえばこうなる:
で、
1 Set-ExecutionPolicy Unrestricted
ここまではまぁ PowerShell の「基礎」として、ちゃんとしたサイトにはちゃんと書いてある。
で、本題の話はここから。
「ワタシが本格的職業Windowsプログラマだった頃」には知っていたはずの、でも随分前なので忘れていたこと、そしてその知識は Mark Russinovich の「Sysinternals」がまだ「Winternals Software」だった頃に Mark Russinovich が MSDN Magazine に書いていた記事からだった、と思う。
何か? つまり…「Where Does Windows Keep Track of the Downloaded from the Internet Status?」。なんで Windows はダウンロードしたことを知ってるの? って話。エクスプローラでしか生活しないユーザも、DOS プロンプト中心で生活しているユーザでさえ、まず気付かない隠しファイルがあるの…知ってる? しかもファイル移動に追従します。
正直このサイト読むまでは完全に忘れていたのだけれど、「alternate data stream (ADS)」がこっそり作られてるのだね。そして、「Microsoftに買収されたのちの Sysinternals」で入手できる「streams.exe」は、これを説明するためのプログラム、でした。標準プログラムだと、dir で見ることが出来ます:
(cmd /c は MSYS からやってるから必要なだけで、普通に生 DOS プロンプトの場合は「dir /r」で良いです。)
なお、ストリームの知識がなくとも日常生活に支障はないです:
これは知ってるかもね、皆。
Mark Russinovich の著書は結構新しいのが出てるんだね:
Windows Internals, Part 1 (6th Edition) (Developer Reference) |
Windows Internals, Part 2 (6th Edition) (Developer Reference) |
で、ここまでは「Windows 内部(Internal)」な、テクニカルな話、ではある。
実は本題というか、「ネタ」はここから。ヘンな話だけど、要はこのストリームから切り離すのに「移動」「コピー」どれもダメなんだけれど、「中身のコピーで新規作成」なら良いことは理解出来るよね? てことは:
1 me@host: ~$ cat dl_from_internet.ps1 > my_local.ps1
これで「my_local.ps1」は「インターネットからダウンロードしたファイル」でなくなります。当ったり前、ではあるけれど、なんで当たり前なのか、は、ストリームの説明がないと成立しない、とまぁ、そんな話でした。
(レジストリに書き込んでる、とかそんなんじゃないのです。)
2015-03-28 追記:こんな本があることを知った
Mark本人が書いたものらしい。欲しいな。買うかも。