2 votes

Quelle est la syntaxe correcte pour passer un argument à mon paramètre dans un script PowerShell ?

J'ai un script:

function comparisonScriptAIX
    {
        Param(
            $sideToCheck
        )

    #contenu de mon script 
    #tel que la création de fichiers
    #l'exécution d'actions etc...  
    }

comparisonScriptAIX -sideToCheck 

Si je lance ceci, j'obtiens une erreur:

comparisonScriptAIX : Argument manquant pour le paramètre 'sideToCheck'. Spécifiez un paramètre de type 'System.Object' et réessayez.

Cela a du sens car aucun argument n'est fourni au paramètre. Si je change un peu le code comme ceci:

comparisonScriptAIX -sideToCheck "Blabla"

Il s'exécutera. Maintenant, je veux que le script s'exécute via le Planificateur de tâches et passe un argument, donc j'ai supprimé le "blablabla" du script. J'ai créé une tâche et cette tâche exécute correctement le script lorsque je n'inclus pas "-sideToCheck". Mais lorsque j'inclus "-sideToCheck", rien ne se passe.

Programme/script:

%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe

Ajouter des arguments (optionnel):

-NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File G:\Scripts\check_AIX.ps1 -sideToCheck "CMDB"

Maintenant, je ne connais pas la syntaxe correcte pour passer l'argument de CMDB au paramètre du script Powershell. De plus, je ne suis pas sûr si la syntaxe en Powershell est correcte.

Pourquoi cela ne fonctionne-t-il pas, et comment puis-je résoudre ce problème?

EDIT 13-12-2022:

En fonction des commentaires/réponses, j'ai mis à jour le script:

comparisonScriptAIX -sideToCheck $sideToCheck

Et j'ai également ajouté la ligne suivante pour utiliser le journal qui est déjà dans le script:

"$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") : $($sideToCheck)" | Out-File -encoding ascii $errorLog -append

Lorsque je lance ce script dans Powershell (donc pas encore de tâche), le résultat dans le journal est le suivant:

2022-12-13 10:52:24 : 

Lorsque je le lance à partir du planificateur de tâches, cela ressemble à ceci:

2022-12-13 10:55:00 : 

Les données (dans mon exemple "CMDB") ne sont pas encore passées au script. Je m'attends à voir ce qui suit dans le journal:

2022-12-13 11:03:00 : CMDB

Le script s'exécute, mais la valeur n'est pas encore passée.

EDIT 2 J'ai également essayé:

        Param(
        [Parameter()]
        [string]$sideToCheck
    )

1voto

Vous avez ceci dans la fonction de votre script que vous appelez et qui définit la fonction, ce qu'elle fait, et tout paramètre que vous définissez pour qu'elle l'utilise lors de son appel.

function comparisonScriptAIX
    {
        Param(
            $sideToCheck
        )

    #contenu de mon script 
    #comme la création de fichiers
    #l'exécution d'actions etc...
    }

Dans ce même script qui définit la fonction, vous appelez également la fonction avec le paramètre nommé mais vous avez omis la variable à passer à la fonction lors de cet appel.

Lorsque le script s'exécute et appelle la fonction, il ne passe pas la valeur que vous avez définie pour la variable de paramètre. Ainsi l'erreur indiquant qu'il manque au moment de l'exécution de la fonction lors de son appel dans le script.

Changez ceci

comparisonScriptAIX -sideToCheck 

Pour devenir ceci

comparisonScriptAIX -sideToCheck $sideToCheck

Pour résoudre définir le param() en début de script puisque vous le passez au script pour le définir lorsque PowerShell -Fichier appelle le script. Il réutilisera ensuite sa valeur pour la passer à l'appel de fonction à l'intérieur du script pour vous donner la sortie attendue.

Le script complet devrait ressembler à ceci.

Param($sideToCheck);

function comparisonScriptAIX { 
    Param($sideToCheck)
    "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") : $($sideToCheck)" | Out-File -encoding ascii $errorLog;
    };
comparisonScriptAIX -sideToCheck $sideToCheck;

Décomposition de la capture d'écran logique entrez la description de l'image ici

Exécutez-le avec PowerShell.exe via cette syntaxe :

%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File G:\Scripts\check_AIX.ps1 -sideToCheck "CMDB"

Ressources de support

  • Fonctions

  • Passer des paramètres à un script PowerShell

    Param

    Pour définir des arguments par nom, utilisez une instruction param, qui est une liste séparée par des virgules de variables, éventuellement précédée d'un [type de données] et/ou avec des valeurs par défaut =.

    Si utilisée, l'instruction param DOIT être la première chose dans votre script ou fonction :

0voto

Todor Petkov Points 1

Je pense que ce que vous cherchez s'appelle un switch.

Vous devez modifier vos paramètres pour ressembler à ceci :

function comparisonScriptAIX
{
    Param(
        [switch]$sideToCheck
    )
}

Voici comment vous l'appelez :

comparisonScriptAIX -sideToCheck

Voici comment vous vérifiez :

if ($sideToCheck.IsPresent) {
    # yada yada
}

plus d'informations : si vous utilisez PowerShell Core, vous pouvez traiter le switch comme un boolean. cela fonctionne également :

if ($sideToCheck) {
    # yada yada
}

voici le lien vers la documentation :

https://learn.microsoft.com/fr-fr/powershell/module/microsoft.powershell.core/about/about_functions_advanced_parameters?view=powershell-7.3

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X