web-dev-qa-db-fra.com

"Objet requis" lors de l'utilisation de Set dans une affectation

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

Cela me donne une erreur: 

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

11
el ninho

Mise à jour

Comme il n’est pas évident de penser que le mieux est de signaler que votre problème avec Object Required est dû à cette ligne 

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

Cela est dû au fait qu'un objet est attendu mais que vous lui affectez une chaîne. En supprimant la variable Set, votre code fonctionnera (As Ekkehard.Horner a a souligné ).


Ci-dessous, mon interprétation de la situation. En examinant d'abord votre code, vous avez presque l'impression qu'il a mélangé l'instanciation de l'objet WScript.Shell avec la ligne de commande de la méthode .Run(). C’est la première fois que j’ai essayé de casser le code, de le réorganiser puis de le remettre en place.


Réponse originale

  1. Votre Set scmd devrait instancier le WScript.Shell (As Ekkehard.Horner indique que vous pouvez utiliser Server.CreateObject("WScript.Shell").Run pour une référence unique, mais je ne le recommanderais pas).

  2. La .Run() doit être exécutée par l'objet instancié scmd et la ligne de commande à exécuter.

Voici un exemple que j'ai renommé certaines des variables (scmd à cmd par exemple).

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

Points à considérer

Lors de l'utilisation de WScript.Shell dans Classic ASP pour exécuter des exécutables, il convient de prendre en compte certains éléments.

  1. La commande Exécuter sera exécutée en utilisant l'identité actuelle du pool d'applications.

  2. Exécuter exécutera l'exécutable sur le serveur, pas sur le client (côté serveur). 

12
Lankymart

Comme

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

prouve, il n’existe aucune règle ou loi du tout que "Votre Set scmd devrait instancier le WScript.Shell". Placer la commande à exécuter dans la variable chaîne scmd (ou peut-être mieux sCmd) et ne pas créer de variable pour une valeur à utilisation unique sont de bonnes pratiques.

La version révisée (moins le stupide Set):

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

fonctionnera aussi bien que la version de Lankymart. 

Pour tout épeler:

  1. Le mot clé Set, sa sémantique et son message d'erreur sont des défauts de conception qui rendent l'utilisation de VBScript plus difficile. "site:stackoverflow.com vbscript "object required" Set" génère 1500 occurrences. Même si beaucoup de ces hits ne concernent pas la gaffe "Set x = 'non-object', c’est clairement trop. Pour expliquer/excuser ces EEI, vous devez considérer que BASIC est une langue de l’âge de pierre.
  2. Une personne qui apprend VBScript a le droit d'être surprise deux fois de l'erreur "Set x = 'non-object'. Si cela se produit trois fois (ou plus souvent), il devrait avoir honte (et garder le silence à ce sujet). Avant tout, ce problème ne devrait pas polluer ce site.
  3. Lorsque j'ai posté ma contribution, toutes les réponses/commentaires - à l'exception de «Il suffit de supprimer l'ensemble» d'Alex K. K. - étaient accentués/concentrés sur la déclaration .Run; une réponse a appelé le script "topsy curvy", une réponse a même répété l'atrocité. J'ai donc essayé de souligner qu'il y a exactement one error: The Spurious Set.
  4. J'ai échoué lamentablement. Preuve: John Saunders a changé le titre "d'erreur VBScript" (non spécifique mais vrai) en "" Objet requis "lors de l'appel de Run on Wscript.Shell" (spécifique mais erroné), Lankymart s'est lancé dans des recherches psychologiques/philologiques pour sauver le Set frais de la chaîne.
  5. Mon seul espoir: Tous ceux qui liront ceci seront tellement dégoûtés par mon harping sur le plateau, qu’ils réfléchiront désormais à deux fois lors de la frappe:

wtf

Set x = "     ---- stop or be damned!!!
Set x = obj.getNumber() + 4  ---- oh no!!!
  1. Tout en vain - Même erreur encore
0
Ekkehard.Horner