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}
3 Réponses :
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)
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 code > à la place.
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
.
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
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é.