wake-up-neo.com

"Objekt erforderlich" bei Verwendung von Set in einer Zuordnung

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

Es gibt mir einen Fehler: 

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

11
el ninho

Update

Da es nicht eindeutig ist, sollten Sie darauf hinweisen, dass Ihr Object Required-Problem auf diese Zeile zurückzuführen ist 

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

Dies liegt daran, dass ein Objekt erwartet wird, ihm jedoch eine Zeichenfolge zugewiesen wird. Durch Entfernen der Set wird Ihr Code funktionieren (As Ekkehard.Horner has wies auf ).


Unten ist meine Interpretation der Situation. Beim ersten Blick auf Ihren Code sah es fast so aus, als hätte er die Instantiierung des WScript.Shell-Objekts mit der Befehlszeile für die .Run()-Methode gemischt. Es war mein erster Versuch, den Code aufzubrechen, neu zu ordnen und wieder zusammenzufügen.


Ursprüngliche Antwort

  1. Ihr Set scmd sollte den WScript.Shell instanziieren (Als Ekkehard.Horner weist Sie darauf hin, dass Sie Server.CreateObject("WScript.Shell").Run für eine einmalige Referenz verwenden können, aber ich würde es nicht empfehlen).

  2. Das .Run() sollte vom instanziierten scmd-Objekt ausgeführt werden und die Befehlszeile zur Ausführung übergeben.

Hier ist ein Beispiel, bei dem ich einige der Variablen umbenannt habe (zum Beispiel scmd in 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

Dinge zu beachten

Wenn Sie WScript.Shell in Classic ASP verwenden, um ausführbare Dateien auszuführen, müssen einige Punkte beachtet werden.

  1. Der Befehl Ausführen wird mit der aktuellen Anwendungspoolidentität ausgeführt.

  2. Run führt die ausführbare Datei auf dem Server aus, nicht auf dem Client (Server-Seite). 

12
Lankymart

Wie

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

beweist, es gibt überhaupt keine Regel oder Vorschrift, dass "Ihr Set scmd die WScript.Shell instanziieren soll". Es ist empfehlenswert, den Befehl in der String-Variablen scmd (oder vielleicht besser sCmd) auszuführen und keine Variable für einen nur einmal verwendeten Wert zu erstellen.

Die überarbeitete Version (abzüglich des blöden Sets):

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

wird genauso gut funktionieren wie Lankymarts Version. 

Um alles zu buchstabieren:

  1. Das Set-Schlüsselwort, seine Semantik und seine Fehlermeldung sind Designfehler, die die korrekte Verwendung von VBScript erschweren. "site:stackoverflow.com vbscript "object required" Set" ergibt 1500 Treffer. Auch wenn viele dieser Treffer den "Set x = 'non-object'-Fehler nicht betreffen, ist das eindeutig zu viel. Um diese IEDs zu erklären/zu entschuldigen, muss berücksichtigt werden, dass BASIC eine Sprache aus der Steinzeit ist.
  2. Eine Person, die VBScript lernt, ist berechtigt, zweimal von dem "Set x = 'non-object'-Fehler überrascht zu werden. Wenn es dreimal vorkommt (oder öfter), sollte er/sie sich schämen (und darüber schweigen). Vor allem dieses Problem sollte diese Seite nicht verschmutzen.
  3. Als ich meinen Beitrag veröffentlichte, betonten/konzentrierten sich alle Antworten/Kommentare - mit Ausnahme von Alex K. 'Nur das Set löschen' - auf die .Run-Anweisung. Eine Antwort nannte das Skript "topsy curvy", eine Antwort wiederholte sogar die Grausamkeit. Also habe ich versucht darauf hinzuweisen, dass es genau one error gibt: Der falsche Satz.
  4. Ich bin kläglich gescheitert. Beweis: John Saunders änderte den Titel von "VBScript-Fehler" (unspezifisch, aber wahr) in "Objekt erforderlich" beim Aufruf von "Run on Wscript.Shell" (spezifisch, aber falsch). Lankymart beschäftigte sich mit psychologischen/philologischen Untersuchungen, um das Set auf der Website zu speichern Kosten der Zeichenfolge.
  5. Meine einzige Hoffnung: Jeder, der das liest, wird durch meine Harfen am Set so angewidert sein, dass er/sie von jetzt an beim Tippen zweimal nachdenken wird:

wtf

Set x = "     ---- stop or be damned!!!
Set x = obj.getNumber() + 4  ---- oh no!!!
  1. Alles ohne Erfolg - Gleicher Fehler wieder
0
Ekkehard.Horner