2011-06-01 4 views
-1

Je suis en train de créer un framework de test pour mon équipe de développement actuelle. Une chose que je voudrais leur laisser faire est de créer un script Powershell pour exécuter leurs tests. Le système est un système de déploiement de base de données, donc pour le tester, ils devront potentiellement exécuter du code d'installation, puis le déploiement sera lancé, puis ils vont exécuter du code de vérification à la fin.Exécution d'un nom de fonction set dans plusieurs scripts Powershell

Étant donné que le déploiement prend un certain temps, j'aimerais que le framework gère une fois pour tous les tests. Ainsi, le débit de base est:

Run test #1 set-up 
Run test #2 set-up 
Run test #3 set-up 
Run the deploy process 
Run the code to confirm that test #1 passed 
Run the code to confirm that test #2 passed 
Run the code to confirm that test #3 passed 

je me suis dit que je devais le cadre toujours appeler une fonction appelée « setup » (ou quelque chose de similaire) dans tous les scripts Powershell dans un répertoire particulier. Si aucune fonction "setup" n'existe, cela ne devrait pas être le cas. Ensuite, je voudrais exécuter le déploiement et ensuite exécuter les autres fonctions dans les scripts Powershell. Étant donné une liste de répertoires, comment puis-je faire défiler chaque script Powershell et exécuter ces fonctions?

Merci pour toute indication!

Répondre

0

Merci aux idées de Matt, j'ai pu rencontrer Invoke-Expression. Idéalement, j'aurais aimé utiliser Invoke-Command avec le paramètre -filepath, qui est supposé par défaut s'exécuter localement. Cependant, il existe un bogue qui nécessite l'utilisation du paramètre -ComputerName même lorsqu'il est exécuté localement. Si vous utilisez ce paramètre, il nécessite l'activation de l'accès distant, même lors de l'exécution sur l'ordinateur local.

Voici le code que je dans mon script:

# Run the setup functions from all of the Powershell test scripts 
foreach ($testPSScript in Get-ChildItem "$testScriptDir\*.ps1") { 
    Invoke-Expression "$testPSScript -Setup" 
} 

# Do some other stuff 

# Run the tests in the Powershell test scripts 
foreach ($testPSScript in Get-ChildItem "$testScriptDir\*.ps1") { 
    Invoke-Expression "$testPSScript" 
} 

Mon script de test puis ressemblait à ceci:

param([switch]$Setup = $false) 

if ($Setup) {write-host "Setting things up"; return} 

Write-Host "Running the tests" 
1

ceci se répètera dans le dossier donné et exécutera tous les scripts setup.ps1 trouvés.

Get-ChildItem D:\test -Recurse | where { $_.name -eq "setup.ps1" }| foreach { 
    "Executing $($_.Fullname)" 
    Invoke-Expression "$($_.Fullname) -setup -Verbose" 
} 

Il n'accepte pas les paramètres si ....

Si vous voulez juste aller un dossier en profondeur ce fera le travail:

Get-ChildItem D:\test | where{$_.psiscontainer}|foreach { 
    Get-ChildItem $_.fullname | where { $_.name -eq "setup.ps1" }| foreach { 
     "Executing $($_.Fullname)" 
     Invoke-Expression "$($_.Fullname) -setup -Verbose" 
    } 
} 

Il m'a irrité un peu que les paramètres n'ont pas fonctionné - je me demande si l'utilisation du Invoke-Command pourrait fonctionner pour cela. Je n'ai pas le temps d'essayer maintenant, à moins que quelqu'un d'autre s'en rende compte, je reviendrai plus tard.

est ici le script utilisé pour i setup.ps1

[cmdletbinding()] 
Param() 

function setup() { 

    Write-Verbose "In setup 1" 
    Write-Output "Done setup 1" 

} 

setup 

HTH

+0

Merci. Je savais qu'il y avait une syntaxe à appeler par un nom de variable qui incluait des parenthèses, mais je ne pouvais pas le trouver n'importe où. Je vais aussi essayer certains de mes propres tests et poster ici avec des résultats. De plus, mon but était d'exécuter une fonction de configuration dans tous les scripts, mais j'ai ensuite pensé à utiliser un paramètre de commutateur "-setup" ... bien sûr cela nécessite de pouvoir passer des paramètres :) –

+0

J'ai testé votre premier script et il vient de renvoyer la valeur de la variable chaîne (le chemin complet du script). Invoke-Command a eu quelques problèmes (il semble y avoir un bug qui nécessite l'utilisation de param "-ComputerName", mais c'est un appel distant même si sur l'ordinateur local.Je vais poster une solution. Je vous ai donné le vote. Si vous voulez que je change la réponse sélectionnée, vous pouvez changer la vôtre et je la changerai. Merci pour l'aide! –

+0

@ Tom-H. Merci pour le vote en hausse - il est un peu tard pour moi en ce moment. Je viens de réaliser que Invoke-command utilise WinRM lorsqu'il est appelé avec le paramètre filepath local - c'était nouveau pour moi! Heureux d'avoir aidé. – Matt

Questions connexes