web-dev-qa-db-ja.com

VBScript(cscriptで起動されたvbsファイル)に引数を渡すことはできますか?

このスクリプトは「test.vbs」に保存されています。

Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.OpenTextFile(workFolder &"\test.txt", 2, True)
File.Write "testing"
File.Close
Set File = Nothing
Set FSO = Nothing
Set workFolder = Nothing

スクリプトを実行するときに、「workFolder」変数の値を渡します。

これどうやってするの?できますか? 「cscript test.vbs workFolder: 'C:\ temp \'」のようなものでしょうか?

ボーナス質問:「set workFolder = Nothing」で渡された変数をクリーンアップする必要がありますか、または終了時にVBSCriptが自動的にそれを行いますか? 「Set File = Nothing」と「Set FSO = Nothing」も不要なのかもしれません。これらの両方の質問に対する答えを知っている場合はお知らせください。

76
Peter

WScript.Argumentsを使用して、スクリプトに渡された引数にアクセスできます。

スクリプトを呼び出す:

cscript.exe test.vbs "C:\temp\"

スクリプト内:

Set File = FSO.OpenTextFile(WScript.Arguments(0) &"\test.txt", 2, True)

実際にスクリプトに引数が渡されているかどうかを確認することを忘れないでください。これを行うには、Countプロパティを確認します。

if WScript.Arguments.Count = 0 then
    WScript.Echo "Missing parameters"
end if

ファイルを閉じた後にスクリプトが終了した場合、変数をNothingに設定する必要はありません。 cscript.exeプロセスが終了すると、リソースは自動的にクリーンアップされます。通常、変数をNothingに設定する必要があるのは、スクリプトの実行中にリソースを明示的に解放する場合のみです。その場合、COMオブジェクトへの参照を含む変数をNothingに設定すると、スクリプトが終了する前にCOMオブジェクトが解放されます。これはボーナスの質問に対する簡単な回答です。詳細については、次の関連する質問をご覧ください。

VBA関数内でオブジェクトをNothingに設定する必要があります

VB6で変数を「Nothing」に設定する必要があるのはいつですか?

128
Dirk Vollmar

VBSの内部でパラメーターにアクセスできます

Wscript.Arguments(0)
Wscript.Arguments(1)

等々。パラメーターの数:

Wscript.Arguments.Count
18
Oleg

コマンドライン経由で渡される各引数には、次のコマンドでアクセスできます。Wscript.Arguments.Item(0)ここで、ゼロは引数番号です。つまり、0、1、2、3などです。

したがって、あなたのコードには次のものがあります:

strFolder = Wscript.Arguments.Item(0) 

Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.OpenTextFile(strFolder, 2, True)
File.Write "testing"
File.Close
Set File = Nothing
Set FSO = Nothing
Set workFolder = Nothing

Wscript.arguments.countを使用すると、誰かが適切な値を入力しなかった場合などにエラーをトラップできます。

MS Technetの例

5
unrealtrip

実際、ボーナスの質問に対する答えは「いいえ」です。クリーンアップする必要はありません。しかし、一般的なプログラミングの習慣は、夕食後に皿をきれいにするなど、常にあなたのものをきれいにすることです。

2
Eric Ng

新しいプログラマーを教える際に、「クリーンアップする必要がありますか?」に対する正しい答え。常にイエスです。片付けをする習慣がある場合、片付けます。その後、実際に必要な場合(最も小さいものがヒープを混乱させるなど)、クリーンアップは習慣であり、行われます。

より良い質問は、「このスクリプトの最後でクリーンアップすると問題が発生しますか?」です。またはそれ以上...「長いスクリプトを使用している(またはGCを使用できない)と仮定すると、これはこれらのオブジェクトをクリーンアップする正しい方法ですか?」

私の2セント。ポール

2
Paul