Hey, Scripting Guy!

Hey, Scripting Guy!

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

Hey, Scripting Guy! アーカイブも忘れずにチェックしてください。

今日の質問 : ユーザーに強制的に特定の順序でコマンドライン引数を入力させる方法はありますか


ユーザーに強制的に特定の順序でコマンドライン引数を入力させる方法はありますか

Q

Scripting Guy さん、よろしくお願いします。ユーザーに強制的に特定の順序でコマンドライン引数を入力させる方法はありますか。

-- JA

A

JA さん、こんにちは。このコラムを執筆している Scripting Guy ですが、彼には 16 才になる息子がいます。彼はコルト リーグ ベースボールをコーチしており、他の Scripting Guy 全員と毎日いっしょに働いています。こうした状況があるので、誰かに何かをさせることはおろか、ユーザーに特定の順序でコマンドライン引数を入力させることが可能であるなど彼が信じないのも当然です。申し訳ありませんが、我々が知る限り、ユーザーに特定の順序でコマンドライン引数を強制的に入力させる方法はありません (たとえば、myscript.vbs atl-fs-01 alerter など。ここで、atl-fs-01 はコンピュータ名、alerter はサービス名)。とにかくできないのです。

でも、待ってください。どうぞまだ行かないでください。Scripting Guys は皆さんを手ぶらで返すようなことは決してしません。さて、この件であなたが本当に必要としているのはどういうことなのかについて考えてみましょう。コンピュータ名がサービス名の前に入力されているかどうかは本当は問題ではなく、どちらのコマンドライン引数がどちらであるかを知る方法を探しているのではないでしょうか。それなら納得がいきます。それに、次の 2 つのコマンドではまったく異なる結果が生成されます。

myscript.vbs atl-ws-01 alerter 
myscript.vbs alerter atl-ws-01

ユーザーがコンピュータ名を先に入力するように強制するわけは、最初の引数が必ずコンピュータ名で 2 番目の引数が必ずサービス名になるようにするためです。順序は本当は重要ではないのではないかと思います。必要なのは、どちらの引数がコンピュータ名を表し、サービス名を表すかを特定できることなのです。

本当は順序は問題ではなく、どちらの引数がどちらであるかを特定できるようにすることこそが必要であるのなら、答えは次のようになります。

If Wscript.Arguments.Named("s") = "" Or Wscript.Arguments.Named("c") = "" Then 
    Wscript.Echo "You must specify both the service and the computer using syntax like this:" 
    Wscript.Echo 
    Wscript.Echo "myscript.vbs /s:alerter /c:atl-ws-01" 
    Wscript.Quit 
End If 
 
Wscript.Echo "Service: " & Wscript.Arguments.Named("s") 
Wscript.Echo "Computer: " & Wscript.Arguments.Named("c")

このスクリプトで行っているのは、Windows Script Host で "名前付き引数" を使用していることです。ユーザーにコマンドライン引数を特定の順序で強制的に入力させることはできませんが、"名前で" 引数を指定するように求めることはできます。このスクリプトでは、s および c という名前の引数を指定するようにユーザーに求めます。つまり、次のいずれかのステートメントからスクリプトを開始する必要があります。

myscript.vbs /s:alerter /c:atl-ws-01 
myscript.vbs /c:atl-ws-01 /s:alerter

2 つの引数のいずれか (または両方) がない場合は、スクリプトは使用方法を表示し、終了します。たとえば、次のように /s や /c を指定せずにスクリプトを開始しようとしているとします。

myscript.vbs alerter atl-ws-01

そうすると、次のように表示されます。

You must specify both the service and the computer using syntax like this: 
 
myscript.vbs /s:alerter /c:atl-ws-01

これは簡単なのでしょうか。いいえ、簡単ではありません。言うまでもなく、次のように、(サービスの) /s を入力し、続いてコンピュータ名を入力する可能性があります。

/s:atl-ws-01

これは防ぎようがありません。しかし、最低でも、どちらの引数がサービス名を表すべきであるかについてははっきりします。そして、これこそが希望していたことではないでしょうか。

それでは、このスクリプトはどのように動作するのでしょうか。重要なのはコードのまさに最初の行です。

If Wscript.Arguments.Named("s") = "" Or Wscript.Arguments.Named("c") = "" Then

ご覧のとおり、ここでは 2 つのことを確認しています。名前付き引数 s が空の文字列であるかどうか、"または" 名前付き引数 c が空の文字列であるかどうかです。引数 s が空の文字列であるとします。つまり、次のいずれかであることになります。スクリプト開始時にその特定の引数を含んでいなかったか、または、その引数に値を指定しなかったかです (たとえば、myscript.vbs /s: /c:atl-fs-01 などのコマンドを使用してスクリプトを開始しています)。名前付き引数 s と c のいずれかに引数がない (または値がない) 場合は、次のコード ブロックが実行されます。

Wscript.Echo "You must specify both the service and the computer using syntax like this:" 
Wscript.Echo 
Wscript.Echo "myscript.vbs /s:alerter /c:atl-ws-01" 
Wscript.Quit

このコードは使用方法を単にエコー バックし、Quit メソッドを使用してスクリプトを終了します。つまり、正しい引数を指定しないと、スクリプトは実行されません。以上。

しかし、両方の引数に値を指定するとします。その場合は、スクリプトが次の 2 行のコードを使用して、2 つの引数の値をエコー バックします。

Wscript.Echo "Service: " & Wscript.Arguments.Named("s") 
Wscript.Echo "Computer: " & Wscript.Arguments.Named("c")

もちろん、それらの値を使用してもっと興味深いこと、たとえばコンピュータ c に接続し、サービス s を停止するなどを実行することもできますが、それは皆さん次第です。重要なのは、ユーザーに特定の引数を入力するように要求し、どちらの引数がどちらであるかを特定できることです。そして、これらすべてを最低限のコードでできるということです。

ここで 2 〜 3 の注意点があります。まず、引数名は任意の変数を使用できます。この例では s および c を使用しましたが、これは入力しやすく覚えやすいためです。ただし、これらの引数に任意の名前を付けることもできます。その場合は、それに応じてコードを変更する必要があります。たとえば、service および computer を使用する必要がある場合、スクリプトの最初の行は次のようになります。

If Wscript.Arguments.Named("service") = "" Or Wscript.Arguments.Named("computer") = "" Then

次に、引数の名前は、引数の指定で使用する構文と少し異なることに注意してください。引数は s と c という名前ですが、それらの引数を実際に使用するときは、構文 /argument_name:argument_value を使用する必要があります。次のように入力しないでください。機能しなくなります。

myscript.vbs s alerter c atl-ws-01

代わりに、次のように入力します。

myscript.vbs /s:alerter /c:atl-ws-01

他にもう 1 つあります。引数値に空白が含まれている場合は、値を二重引用符で囲みます。たとえば、Automatic Updates サービスを停止するとします。その場合は、コマンドを次のように入力する必要があります。

arguments.vbs /s:"Automatic Updates" /c:atl-fs-01

もちろん、順序は重要ではありません。コンピュータ名、次にサービス名を入力する方がいい場合は、え、なんですって、なぜいやなんですか。

ちなみに、コマンドライン引数の全体的な考え方をよく知らない方は、「Tales from the Script」コラムの「スクリプトは引数が好き (英語)」を参照してください。いや、もちろん、そのコラムを読むことを皆さんに "強制" することはできません。誰かにコマンドライン引数のスクリプトについての記事を読ませることなどできないばかりか、ライトがカットオフ マンに投球させることもできませんでも、現在も努力しています。

: どちらについて努力しているのでしょうか。強制的に記事を読んでもらうことです。ライトについてはもうあきらめました。


関連情報

Hey, Scripting Guy! - アーカイブもチェックしてください。

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