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


85

このスクリプトを「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」変数の値を渡したいと思います。

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

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

回答:


138

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」に設定する必要があるのはいつですか。


ビンゴ、それだけです!非常に明確です、どうもありがとう。(ボーナスの質問は、誰かがこれらのコメントの1つで答えたい場合に備えて、まだ開いています。)
Peter

@ピーター:ボーナスの質問に短い回答を追加しました。
Dirk Vollmar 2010年

21

VBS内では、次のパラメータにアクセスできます。

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

等々。パラメータの数:

Wscript.Arguments.Count

ありがとうございました!(ボーナスの質問は、誰かがこれらのコメントの1つで答えたい場合に備えて、まだ開いています。)
Peter

6

コマンドラインを介して渡される各引数には、次のコマンドでアクセスできます。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を使用すると、誰かが適切な値を入力しなかった場合などにエラートラップを実行できます。

MSTechnetの例


ああ、ありがとう。Wcriptのインスタンスを作成する必要がないのは興味深いことです。(ボーナスの質問は、誰かがこれらのコメントの1つで答えたい場合に備えて、まだ開いています。)
Peter

1)workFolder上記の回答でも元の質問でもオブジェクトとして定義されていないSet workFolder = Nothingため、エラーが発生するはずです。2)引数は複数回再利用する必要があるとは示唆されていないため、strFolder変数への割り当てをスキップしてください。3)inのx代わりに使用することをお勧めします0Wscript.Arguments.Item(0)
user66001 2015年

実際には、オプション明示が設定されていない限りエラーは発生しません。その場合、何も定義されていないため、何も機能しません。これは変数についても当てはまりますが、必須ではありません。また、FSOオブジェクトもFILEオブジェクトも使用できず、単純なwithを使用できます。可能性のあるさまざまなアプローチのトン... :)
unrealtrip 2015年

2

オプションで、任意の順序で指定できる名前付き引数を使用することもできます。

Set namedArguments = WScript.Arguments.Named

これがちょっとしたヘルパー関数です:

Function GetNamedArgument(ByVal argumentName, ByVal defaultValue)
  If WScript.Arguments.Named.Exists(argumentName) Then
    GetNamedArgument = WScript.Arguments.Named.Item(argumentName) 
  Else  
    GetNamedArgument = defaultValue
  End If
End Function

VBSの例:

'[test.vbs]
testArg = GetNamedArgument("testArg", "-unknown-")
wscript.Echo now &": "& testArg

使用例:

test.vbs /testArg:123

0

ボーナスの質問に答えるには、一般的な答えは「いいえ」です。WscriptまたはCscriptによって呼び出されるあなたのような短い.VBSスクリプトで、変数を「なし」に設定する必要はありません。

長いスクリプトの途中でこれを行う理由は、VBが保持していたはずのオペレーティングシステムにメモリを解放するためです。8GBのRAMが一般的で、16GB以上が比較的一般的である最近では、単一の変数に数メガバイトを含む巨大なスクリプトであっても、これが測定可能な影響を与える可能性はほとんどありません。この時点では、1MBまたは2MBのRAMで作業していた可能性がある時代からの一種のホールドオーバーです。

正解です。.VBSスクリプトが完了するとすぐに、すべての変数が破棄され、とにかくメモリが再利用されます。変数を「Nothing」に設定すると、そのプロセスが高速化され、スクリプトの途中で実行できるようになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.