Hey, Scripting Guy!

Scripting Guys が皆さんの質問にお答えします

Hey, Scripting Guy!

TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

詳細情報

Hey, Scripting Guy! カテゴリ別アーカイブ

Hey, Scripting Guy! 日付別アーカイブ

Hey, Scripting Guy! ダウンロード

Spacer

*

Windows PowerShell を使用して環境変数と特別なフォルダのパスを取得する方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。Windows PowerShell を使用して環境変数の値と特別なフォルダのパスを取得する方法はありますか。

-- SB

SpacerHey, Scripting Guy! AnswerScript Center

SB さん、こんにちは。今日は木曜日です。つまりこのコラムを執筆している Scripting Guy は現在ワシントン州ワラワラにいます。ここは、ダフィー・ダックのファンならご存知でしょうが、Wishy Washy Washing Machine Company、アクメ社のさまざまな部門、およびその他わかる限りあらゆるものの本拠地です。

ええ、その他のこともわかっています。ワラワラは "Oo ee oo-ah-ah, ting tang walla walla bing bang" という歌詞でも不朽の名声を得ました。ワラワラは、英語版 Wikipedia の "本質的におかしな言葉" の項目にも載っています。人口 3 万人の町としては破格の待遇だと思いませんか。

もちろん、このコラムを執筆している Scripting Guy はワラワラで何もしないでのんびり過ごしているわけではありません (それは彼が仕事中にしていることです)。それどころか、以下のようなさまざまなことで忙しいのです。

このコラムの執筆

ワラワラ選抜野球トーナメントの第 1 試合の準備

温度計の値が 400 度よりも高くなる様子の観察

正確には 400 度ではないかもしれません。少なくとも摂氏 400 度ではないでしょう。しかし、気温は 38 度まで上昇するという予報で、この Scripting Guy と一緒に来ている高校野球児の両親たちの中には、既に日焼け止めを厚く塗ったり、大量に水を飲んだり、暑さに文句を言ったりしている人もいます。

これは悪い兆候です。何しろ、彼らのほとんどはまだ冷房の効いた車内から出ていませんから。

しかし、このコラムを執筆している Scripting Guy はワシントン州南部の "3 つ子都市" の近くで育ったので、少々の暑さにくじけたりはしません。何しろ、46 度の猛暑の中で野球の試合をしたことがあります (不思議なことに、試合に行くには雪が降りしきる中 12 マイルもの上り坂を歩かなければなりませんでした)。彼は暑さへの文句も、点滴による水分の補給も、日焼け止めを塗ることさえもしていません。そのうえ、これから Windows PowerShell を使用して環境変数と特別なフォルダのパスを取得する方法についての質問に答えようとしています。

まったく雄々しいじゃありませんか。

まず、環境変数の値を取得する方法について説明しましょう。SB さんのおっしゃるように、VBScript では次のようなコードを使用して %logonserver% 環境変数の値を取得できます。

Set oShell = CreateObject("Wscript.Shell")

Set WshSysEnv = oShell.Environment("PROCESS")
sLogonServer = WshSysEnv("LOGONSERVER")

とても簡単ですね。Wscript.Shell オブジェクトのインスタンスを作成し、PROCESS 環境変数のコレクションを取得したら、logonserver の値を sLogonServer という名前の変数に格納します。では、Windows PowerShell を使用して同じ情報を取得するにはどうすればよいでしょうか。もちろん、次のようにします。

$a = $env:logonserver

実に簡単だと思いませんか。実は、Windows PowerShell には Environment プロバイダがあり、コンピュータのすべての環境変数に関する情報に簡単にアクセスできます。ご覧のとおり、必要な作業は $env 変数の後ろにコロンと目的の環境変数の名前を指定するだけです。%username% 環境変数の値を $a という名前の変数に格納する場合は、次の構文を使用します。

$a = $env:username

また、コンピュータ名を知りたい場合は次の構文を使用します。

$a = $env:computername

野球の試合さえなければ、一日中ここに座って環境変数を取得していられるのですが。

良い質問ですね。コンピュータで使用できる環境変数がわからない場合はどうでしょうか。さいわい、たいしたことではありません。すべての環境変数とその値を確認するには、次のコマンドを使用します (この場合、$ を使用せず、その代わりに env: ドライブを参照することに注意してください)。

dir env:

このコマンドを Windows PowerShell で試して、何が返されるか確認してください。

では、特別なフォルダのパスについてはどうでしょうか。SB さんが指摘されたように、これは VBScript で実行する場合、非常に簡単な処理です。たとえば、次の VBScript のコードでは、ユーザーのデスクトップ フォルダのパスを取得します。

Set oShell = CreateObject("Wscript.Shell")

Set oSFolders = oShell.SpecialFolders
sDesktop = oSFolders("Desktop")

ご自分で理解されているでしょうが、上記のスクリプトでは、Wscript.Shell オブジェクトのインスタンスを作成し、SpecialFolders コレクションへのオブジェクト参照を作成して、デスクトップ フォルダのパスを取得しています。Windows PowerShell ではこれとまったく同じ方法を使用できます。または、.NET Framework の System.Environment クラス (および GetFolderPath メソッド) を使用してデスクトップ フォルダのパスを取得することもできます。しかし、総合的に考えた結果、特別なフォルダのパスの取得には、次のように Shell.Application オブジェクトを使用する方が簡単 (かつ強力) だと結論付けました。

$a = New-Object –com Shell.Application
$b = ($a.namespace(0x10)).Self.Path

ええ、確かに、それほど簡単には見えないかもしれません。このことを念頭に置いて、このコマンドのしくみをご説明しましょう。1 行目では、New-Object コマンドレットを使用して新しい COM オブジェクトのインスタンスを作成しているだけです (COM オブジェクトのインスタンスを作成するので –com パラメータを指定しています)。では、どの COM オブジェクトを作成しているのでしょうか。そうです、そのとおりです。Shell.Application です。

実際、この部分はとても簡単ですが、2 行目については話が別です。でも、慌てないでください。2 行目は見かけほど怖くはないのです。実は、2 行目は、1 行のコードで複数の異なる作業を実行しているために複雑に見えるだけです。まず、Shell.Application オブジェクト ($a) へのオブジェクト参照を取得し、Namespace メソッドを使用して特定のフォルダにバインドします。これを行うのがスクリプトの次の部分です。

($a.namespace(0x10))

0x10 は何を表しているのでしょうか。これは、デスクトップ フォルダを表す 16 進数値です。どうして 0x10 がデスクトップ フォルダを表すとわかったのでしょうか。正直なところ、私たちにはわかりませんでした。そのため、スクリプトのリポジトリにアクセスして、特別なフォルダのスクリプトを確認しました。結局のところ、デスクトップ フォルダ内のアイテムを一覧表示するスクリプトは次のようなものです。

Const DESKTOP = &H10&

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(DESKTOP)
Set objFolderItem = objFolder.Self
Wscript.Echo objFolderItem.Path

Set colItems = objFolder.Items
For Each objItem in colItems
    Wscript.Echo objItem.Name
Next

: Windows PowerShell を使用してデスクトップ フォルダ内のすべてのアイテムを一覧表示する場合はどうでしょうか。その場合は、スクリプトの 3 行目に「Get-ChildItem $b」と追加すれば問題ありません。

コードの 1 行目に注目してください。ここでは 16 進数値 &H10& を Desktop という名前の定数に代入しています。&H10& (VBScript の 16 進数値の構文を使用しています) は、デスクトップ フォルダを表す値です。必要な作業は、この値を Windows PowerShell の 16 進数値の構文である 0x10 に変換するだけです。デスクトップ フォルダではなくインターネットの Cookie が保存されているフォルダに関心があるとしましょう。このフォルダを操作するための VBScript スクリプトには、次のコード行が含まれています。

Const COOKIES = &H21&

さて、PowerShell で &H21& に相当する値は何でしょうか。そのとおりです。0x21 です。

このような具合です。

Namespace メソッドの呼び出しをかっこで囲んだことにお気付きの方もいるでしょう。

$b = ($a.namespace(0x10)).Self.Path

なぜこのようにしたかというと、その理由は明快で、Windows PowerShell では常にかっこ内の処理を他の処理より先に実行するからです。つまり、Windows PowerShell では、まず Namespace メソッドを使用してデスクトップ フォルダにバインドします。そして、この処理が完了してから、Self.Path プロパティの値を取得します。この値はちょうどデスクトップ フォルダのパスです。このかっこにより、Windows PowerShell ではフォルダを取得してからフォルダ パスの取得が行われます。

確かに、これは少し紛らわしいです。しかし、いいですか、0x10 を適切な値に置き換えるだけで、簡単にコンピュータの特別なフォルダにバインドできるのです。

SB さんのお役に立てばと思います。実のところ、お役に立つ必要があります。もう試合開始時刻になりますから。ワラワラで高校野球を観戦することは、このコラムを執筆している Scripting Guy にとって思い出の小道をたどる旅のようなものです。実際にワラワラで試合をした高校時代に戻った気分になります。たとえば、2 年生のときの試合では、審判員は労働釈放中のワラワラ州立刑務所の囚人でした。その囚人たちは優秀な審判員だったのでしょうか。こう言わせてください。だれも審判員に口答えしませんでした。本当です。


ページのトップへページのトップへ