0
votes

PowerShell obtient la valeur de retour du script Visual Basic

J'ai du vieux code dans le script Visual Basic. Au lieu de réécrire cet ancien code dans PowerShell, j'aimerais appeler les scripts VB de PowerShell et capturer leur valeur de retour.

Comment puis-je obtenir la valeur de retour d'un script Visual Basic dans PowerShell?

Quelque chose comme ceci:

Function MyFunction() As Double
    Return 3.87 * 2
End Function

La fonction de base visuelle peut ressembler à ceci

$returnValue = Invoke-Command -ScriptBlock{.\vbs\legacyVbsFunction.vbs}


2 commentaires

a) Votre prétendu code VBScript n'est pas du code VBScript (VBScript ne prend pas en charge les valeurs de retour typées). b) La valeur de retour d'une fonction ne définit pas le code de sortie du script. c) Les codes de sortie sont des entiers. Les valeurs à virgule flottante ne sont pas prises en charge.


Veuillez créer un exemple reproductible minimal qui nous permettra de reproduire le problème réel auquel vous êtes confronté.


3 Réponses :


0
votes

Vous n'avez pas vraiment de code de sortie dans le VBS, vous avez un retour pour une fonction. Pour avoir réellement un code de retour, vous devez fermer le script avec quelque chose comme:

(Start-Process -FilePath "wscript.exe" -ArgumentList "Script.vbs" -Wait -Passthru).ExitCode

ou

wscript.quit(returncode)

Dans le script PowerShell, vous devez exécuter le vbs quelque chose comme ceci:

wscript.quit(0) 


5 commentaires

Start-Process n'est pas requis. PowerShell stocke le code de sortie de la dernière commande externe dans la variable automatique $ LastExitCode . Cependant, vous devrez peut-être exécuter VBScripts avec cscript.exe au lieu de wscript.exe par défaut.


En effet, même si je pense que cela pourrait également fonctionner avec wscript.exe.


Je viens de le tester. wscript.exe ne peut pas être utilisé dans les deux cas, car il ne renvoie pas le code de sortie (probablement parce qu'il exécute le script de manière asynchrone).


Faites un test rapide. Créé un vbscript qui n'a que wscript.quit (101) Et dans un script PowerShell mettez la commande suivante: (Start-Process -FilePath "wscript.exe" -ArgumentList "C: \ Users \ theje \ Desktop \ Tests \ Teeets.vbs "-Wait -Passthru) .ExitCode a bien fonctionné: PS C: \ Users \ theje> (Start-Process -FilePath" wscript.exe "-ArgumentList" C: \ Users \ theje \ Desktop \ Tests \ Teeets.vbs "-Wait -Passthru) .SortieCode 101


Ah, j'avais omis le paramètre -PassThru . Cela a du sens maintenant. Mais même ainsi, wscript.exe ne serait utilisable qu'avec Start-Process -Wait -PassThru , donc je recommanderais toujours d'utiliser cscript.exe à la place.



1
votes

Il semble que vous vouliez capturer une sortie d'un VBScript (stdout) :

[double] $output = cscript.exe //nologo .\vbs\legacyVbsFunction.vbs

Notez que $ output sera soit un une chaîne - si le script ne produit qu'une seule ligne - ou un tableau de chaînes en cas de sortie multiligne .

Par exemple , en supposant que . \ vbs \ legacyVbsFunction.vbs contient le code suivant:

Function MyFunction
    MyFunction = 3.87 * 2
End Function

' Call the function and print it to stdout.
Wscript.Echo(MyFunction)

Vous pouvez capturer la sortie et la convertir en [double] comme suit:

$output = cscript.exe //nologo .\vbs\legacyVbsFunction.vbs

$ output contient alors 7.74.


0 commentaires

1
votes

Vous pouvez en fait intégrer une fonction vbscript directement dans PowerShell à l'aide d'un objet com appelé ScriptControl, mais cela ne fonctionne que dans PowerShell 32 bits, C: \ Windows \ SysWOW64 \ WindowsPowerShell \ v1.0 \ powershell.exe: Incorporer VBS dans PowerShell

$returnvalue = 
start-job {
  function Call-VBScript {
    $sc = New-Object -ComObject MSScriptControl.ScriptControl.1
      $sc.Language = 'VBScript'
      $sc.AddCode('
        Function MyFunction
          MyFunction = 3.87 * 2
        End Function
      ')
    $sc.CodeObject
  }

  $vb = call-vbscript
  $vb.MyFunction()
} -runas32 | wait-job | receive-job

"returnvalue is " + $returnvalue

J'ai découvert que vous pouvez exécuter une tâche en 32 bits:

function Call-VBScript
{
  $sc = New-Object -ComObject ScriptControl
  $sc.Language = 'VBScript'
  $sc.AddCode('
    Function MyFunction
      MyFunction = 3.87 * 2
    End Function
  ')
  $sc.CodeObject
}

$vb = Call-VBScript
$returnvalue = $vb.MyFunction()
"returnvalue is " + $returnvalue


0 commentaires