web-dev-qa-db-ja.com

割り当てでセットを使用する場合の「オブジェクトが必要」

call main()
sub main()
    Dim scmd
    Set scmd = "c:\windows\system32\cscript.exe //nologo c:\s.vbs"
    createobject("wscript.Shell").run scmd,0,false
end sub

それは私にエラーを与えます:

Object required: '[string: "c:\windows\system32\"]' Code 800A01A8

13
el ninho

更新

明確ではないので、_Object Required_の問題はこの行が原因であると指摘するのが最善です

_Set scmd = "c:\windows\system32\cscript.exe //nologo c:\s.vbs"
_

これは、オブジェクトが期待されているが、それを文字列に割り当てているためです。Setを削除すると、コードは機能します( Ekkehard.Horner指摘されているように )。


以下は私の状況の解釈です。最初にコードを見ると、_WScript.Shell_オブジェクトのインスタンス化と.Run()メソッドのコマンドラインが混在しているように見えました。コードを分解し、再配置して元に戻すのは、私の最初の試みでした。


元の回答

  1. _Set scmd_は_WScript.Shell_をインスタンス化する必要があります( Ekkehard.Horner が示すように、1回限りの参照にはServer.CreateObject("WScript.Shell").Runを使用できますが、お勧めしませんそれ)。

  2. .Run()は、インスタンス化されたscmdオブジェクトによって実行され、実行するコマンドラインを渡す必要があります。

これは、一部の変数の名前を変更した例です(scmdからcmdなど)。

_Call main()

Sub main()
    'Renamed variables to cmd is your object and cmdline is your file path.
    Dim cmd, cmdline
    'Instantiate WshShell object
    Set cmd = Server.Createobject("WScript.Shell")
    'Set cmdline variable to file path
    cmdline = "c:\windows\system32\cscript.exe //nologo c:\s.vbs"
    'Execute Run and return immediately
    Call cmd.Run(cmdline, 0, False)
End Sub
_

考慮事項

ClassicでWScript.Shellを使用する場合ASP=実行可能ファイルを実行するために、考慮すべき点がいくつかあります。

  1. Runコマンドは、現在のアプリケーションプールIDを使用して実行されます。

  2. Runは、クライアント(サーバー側)ではなくサーバー上で実行可能ファイルを実行します。

13
Lankymart

なので

>> WScript.Echo CreateObject("WScript.Shell").CurrentDirectory
>>
E:\trials\SoTrials\answers\trials\AlgoTaBu\SuSo\wsf

「Your Set scmdはWScript.Shellをインスタンス化する必要がある」という規則や法律はまったくありません。実行するコマンドを文字列変数scmd(またはおそらくより優れたsCmd)に入れ、1回だけ使用される値の変数を作成しないことをお勧めします。

改訂版(愚かなセットを除いたもの):

call main()
sub main()
    Dim scmd
    scmd = "c:\windows\system32\cscript.exe //nologo c:\s.vbs"
    createobject("wscript.Shell").run scmd,0,false
end sub

lankymartのバージョンと同じように動作します。

すべてを綴るには:

  1. Setキーワード、その意味、およびエラーメッセージは設計上の欠陥であり、VBScriptを正しく使用することが困難になります。 "site:stackoverflow.com vbscript "object required" Set"の結果は1500ヒットになります。これらのヒットの多くが"Set x = 'non-object'の失敗に関係していなくても、明らかに多すぎます。これらのIEDを説明/言い訳するには、BASICが石器時代の言語であると考える必要があります。
  2. VBScriptを学習している人は、"Set x = 'non-object'の間違いに2回驚かされる可能性があります。それが3回(またはそれ以上)発生する場合、彼/彼女は恥ずかしいはずです(そしてそれについて沈黙してください)。とりわけ、その問題はこのサイトを汚染するべきではありません。
  3. 投稿を投稿したとき、すべての回答/コメント-アレックスK.の「セットを削除するだけ」を除いて-.Runステートメントに強調/集中しました。 1つの答えはスクリプトを「トプシー曲線」と呼び、1つの答えは残虐行為を繰り返しました。だから私は正確にoneエラーがあることを指摘しようとしました:偽のセット。
  4. 惨めに失敗した。証拠:John Saundersは、タイトルを「VBScriptエラー」(不特定ですがtrue)から「Wscript.Shellで実行」を呼び出すときに「オブジェクトが必要です」(特定ですが間違っています)に変更しました。文字列の費用。
  5. 私の唯一の希望:これを読んでいる人は皆、セットでの私のハープにうんざりしているので、彼女/彼はこれからタイプするときに二度考えます:

wtf

Set x = "     ---- stop or be damned!!!
Set x = obj.getNumber() + 4  ---- oh no!!!
  1. まったく役に立たない- 同じ過ち
0
Ekkehard.Horner