2
votes

Remplacement des variables dans le fichier de configuration

J'essaye d'écrire du code pour vérifier le fichier de configuration s'il contient certains UserParameters et sinon pour les ajouter au fichier. J'ai l'impression que mon code est définitivement faux à bien des niveaux et je suis à court d'idées.

UserParameter=windowsdisk.discovery, powershell -NoProfile -File discover_PerfMon_PhysicalDisk.ps1
UserParameter=vfs.fs.partition.label[*], powershell -NoProfile -File get_volume_label.ps1 $1
UserParameter=psh.rds.empty.session.detect, powershell -NoProfile -File rds_empty_session_detect.ps1
UserParameter=psh.pki.rootca.thumb.count[*], powershell -NoProfile -Command "(Get-ChildItem Cert:\LocalMachine\Root\$1 -ErrorAction SilentlyContinue).Count"

Je ne sais pas exactement comment m'assurer qu'il y aura quelque chose comme: p>

UserParameter=a
UserParameter=b
...
UserParameter=h

Modifier:

Configuration que j'ai actuellement https://pastebin.com/BdwH53QZ

État de la configuration que je veux atteindre: https://pastebin.com/6f0xe2k3

Ajout de nouvelles lignes à la fin du fichier.

$s1 = 'a'
$s2 = 'b'
$s3 = 'c'
$s4 = 'd'
$s5 = 'e'
$s6 = 'f'
$s7 = 'g'
$s8 = 'h'
$scripts = $s1, $s2, $s3, $s4, $s5, $s6, $s7, $s8

foreach ($element in $scripts) {
    if ("(UserParameter=$element)" -notmatch $config) {
        Get-Content $File $element -replace '^(UserParameter=)',"`$1$($element)"
    } else {
        Add-Content $File "UserParameter=$element"
    }


10 commentaires

Qu'essayez-vous de faire? on dirait que vous êtes coincé sur une idée qui ne fait pas ce que vous voulez réellement ... [ sourire ]


J'essaye d'automatiser le script pour changer le fichier de configuration de zabbix. J'ai des paramètres de base en bas, et maintenant je dois ajouter des UserParameters ... pour l'instant, il y a 8 UserParams à ajouter. mais je dois pouvoir en ajouter d'autres et vérifier si elles sont déjà présentes dans le fichier de configuration. S'ils sont présents, sautez sinon ajoutez-les au fichier.


tous les paramètres utilisateur ont-ils le même nom [comme indiqué dans votre exemple]? peut-être devriez-vous ajouter un échantillon du fichier que vous êtes en train de vérifier et montrer ce que vous voulez y faire ...


Le fichier doit avoir des lignes comme ceci: UserParameter = windowsdisk.discovery, powershell -NoProfile -File discover_PerfMon_PhysicalDisk.ps1 UserParameter = vfs.fs.partition.label, powershell -NoProfile -File get_volume_label.ps1 $ 1


utilisez Get-Content pour lire le fichier sous forme de tableau de chaînes. recherchez chaque ligne commençant par UserParameter = . comparez ce qui vient après avec l'un de vos éléments à vérifier, si ce n'est pas là - ajoutez-le. ///// je ne suis pas doué pour ce genre de choses abstraites, donc pour être plus précis, j'aurais besoin de voir un exemple de fichier d'entrée, une liste de choses à vérifier et la sortie attendue des deux - ajoutée dans votre article d'origine, car il est presque illisible autrement. [ sourire ]


Salut, JD, j'ai lu les commentaires trois fois et je ne comprends toujours pas ce que vous essayez de faire, dans l'état actuel, le but est inaccessible, veuillez modifier le message et clarifier la demande, merci. vérifiez le fichier de configuration s'il contient certains paramètres utilisateur Vous êtes donc en train d'enquêter, si par exemple. dans le cas de $ s1 = 'a' le fichier de configuration contient quelque chose = a ?


Salut Vodnik, j'ai ajouté des colles de configurations ... $ s1- $ s8 est ma tentative de matrice de variables pour UserParameters ... correct J'essaie de vérifier si UserParameters = a sinon ajoutez Userparameters = a .... puis faites de même pour 'b' puis 'c' à l'infini


@JDHellequin - merci pour les infos ajoutées! [ grin ] ///// vous pouvez faire ce que j'ai mentionné plus tôt - utilisez Get-Content pour lire le fichier, parcourez-le, vérifiez UserParameter = puis comparez la partie à droite du = avec les entrées de votre liste de choses qui doivent s'y trouver.


@Lee_Dailey ma connaissance de Powershell est une folie autodidacte hier [tacticalfaceplant] //// par exemple. comptez-moi comme quelque chose qui ressemble à un débutant total


Bien, merci pour la clarification, maintenant c'est déjà ce que nous pouvons traiter :) En fait, vous devriez coller des exemples directement dans le message, mais mieux comme ça, que rien.


3 Réponses :


0
votes

Comme vos UserParameters sont assez complexes et que leur comparaison avec un fichier échouerait avec des différences même subtiles dans les espaces blancs, je doute que votre approche fonctionne.

Je suggère de trouver des expressions régulières pour filtrer si un UserParameter donné est déjà présent.

Si vous choisissez PowerShell, il est inévitable d'apprendre ce langage de script ou de le déléguer à quelqu'un d'autre.

Vous pouvez essayer quelque chose du genre:

## Q:\Test\2019\04\24\SO_55827904.ps1
$UserParameters = @"
UserParameter=windowsdisk.discovery, powershell -NoProfile -File discover_PerfMon_PhysicalDisk.ps1
UserParameter=vfs.fs.partition.label[*], powershell -NoProfile -File get_volume_label.ps1 $1
UserParameter=psh.rds.empty.session.detect, powershell -NoProfile -File rds_empty_session_detect.ps1
UserParameter=psh.pki.rootca.thumb.count[*], powershell -NoProfile -Command "(Get-ChildItem Cert:\LocalMachine\Root\$1 -ErrorAction SilentlyContinue).Count"
"@ -split '\r?\n'

ForEach ($File in (Get-ChildItem -Path X:\path -Filter *zabbix_agent.conf)){
    $FileContent = Get-Content $File -raw
    ForEach ($UserParam in $UserParameters){
        if($FileContent -notmatch [RegEx]::Escape($UserParam)){
           Add-Content -Path $File.FullName -Value $UserParam
        }
    }
} 

Vous devrez adapter -Path et -Filter à votre environnement.


1 commentaires

Je n'ai pratiquement pas le choix ... Je dois l'apprendre ... ce que j'ai écrit jusqu'à présent, c'est ce que j'ai autodidacte à partir de descriptions de fonctions et de pure chance ... Avec quelques petites adaptations, votre code fonctionne parfaitement pour moi



0
votes

Une autre approche pourrait être celle-ci:

$file = 'D:\zabbix_agent.conf'

# create an array of userparameters to add if not already present
$userParams = 'UserParameter=windowsdisk.discovery, powershell -NoProfile -File discover_PerfMon_PhysicalDisk.ps1',
              'UserParameter=vfs.fs.partition.label[*], powershell -NoProfile -File get_volume_label.ps1 $1',
              'UserParameter=vfs.fs.partition.label[*], powershell -NoProfile -File get_volume_label.ps1 $2',
              'UserParameter=psh.rds.empty.session.detect, powershell -NoProfile -File rds_empty_session_detect.ps1',
              'UserParameter=psh.pki.rootca.thumb.count[*], powershell -NoProfile -Command "(Get-ChildItem Cert:\LocalMachine\Root\$1 -ErrorAction SilentlyContinue).Count"'

# read the file as a string array
$content = Get-Content -Path $file
# remember the original lines count so we know if parameters were added or not
$originalCount = $content.Count

# get a sub-array of all lines from $content that start with 'UserParameter='
$currentParams = @($content | Where-Object { $_ -match '^UserParameter=' })
if ($currentParams.Count -eq 0) {
    # if the config file did not have any 'UserParameter=' lines, we add the whole $userParams array to the content
    $content += $userParams
}
else {
    # there were 'UserParameter=' lines found, so filter out all required parameters that need to be added
    $addThese = @($userParams | Where-Object { $currentParams -notcontains $_ })
    if ($addThese.Count) { $content += $addThese }
}

if ($originalCount -ne $content.Count) {
    Write-Host "Writing new Zabbix configuration file." -ForegroundColor Yellow
    Set-Content -Path $file -Value $content
}
else {
    Write-Host "File '$file' already contained the required user parameters." -ForegroundColor Green
}


0 commentaires

0
votes

voici ma version. [ grin ] J'ai créé deux fichiers à partir de vos échantillons. un sans lignes UserParameter et un avec deux de ces lignes. le code ci-dessous vérifie s'il existe des lignes de ce type ... sinon, il les ajoute toutes. si oui , il ajoute celles de la liste des valeurs nécessaires manquantes.

$FileList = Get-ChildItem -Path 'C:\Temp\JDHellequin_-_sample - *.txt'
$Prefix = 'UserParameter='

$NeededParamList = @(
    'windowsdisk.discovery, powershell -NoProfile -File discover_PerfMon_PhysicalDisk.ps1'
    'vfs.fs.partition.label[*], powershell -NoProfile -File get_volume_label.ps1 $1'
    'psh.rds.empty.session.detect, powershell -NoProfile -File rds_empty_session_detect.ps1'
    'psh.pki.rootca.thumb.count[*], powershell -NoProfile -Command "(Get-ChildItem Cert:\LocalMachine\Root\$1 -ErrorAction SilentlyContinue).Count"'
    )

foreach ($FL_Item in $FileList)
    {
    $TargetLines = @(Get-Content -LiteralPath $FL_Item.FullName).
        Where({
            $_.StartsWith($Prefix)
            }).
        ForEach({
            $_.Split('=')[1]
            })


    foreach ($NPL_Item in $NeededParamList)
        {
        $NewLine = '{0}{1}' -f $Prefix, $NPL_Item
        if ([string]::IsNullOrEmpty($TargetLines))
            {
            Add-Content -LiteralPath $FL_Item.FullName -Value $NewLine
            }
            else
            {
            if ($NPL_Item -notin $TargetLines)
                {
                Add-Content -LiteralPath $FL_Item.FullName -Value $NewLine
                }
            }
        }
    }

dans chaque cas, le fichier ajouté a quatre lignes qui correspondent aux éléments requis dans la collection $ NeededParamList .


10 commentaires

Merci pour votre version de la solution ... J'ai implémenté la version de LotPings car celle-ci est un peu écrasante pour moi [ facedesk ]


@JDHellequin - vous êtes les bienvenus! [ grin ] celui de LotPings est une approche très similaire - mais il fait une collection de ce qu'il faut ajouter pendant que le mien les ajoute un par un. ses commentaires sont BEAUCOUP mieux que les miens ... [ sourire ]


Je me demande s'il est possible d'attraper des paramètres mal formés (comme un caractère ou un nombre manquant) ... peut-être une sorte de nombre de caractères? Je voulais utiliser pleinement RegEX, mais mon patron ne les comprend pas vraiment, donc je suis banni de les utiliser


@JDHellequin - utiliser regex sur ces paramètres ... serait infernal. [ grin ] les caractères spéciaux intégrés . [] * sont vraiment difficiles à utiliser. c'est pourquoi je suis resté avec -eq au lieu d'essayer d'utiliser -match .


Je pense à if ($ ($ ConfigFileContent | mesure -character -ignorewhitespace) -notmatch $ ($ userparam | mesure -character -ignore whitepace)) ou quelque chose du genre


@JDHellequin - cela me semble ... inutilement détourné. faites un test -eq direct sur les éléments et utilisez un tableau des valeurs de paramètres à tester.


J'ai essayé ceci: foreach ($ param in $ (Get-content $ configfile | Select-String -Pattern '^ (UserParameter =). *')) {If ($ UserParameters -ne $ param) {( Get-content $ configfile -RAW) -replace '$ param', '' | Set-Content $ configfile}} mais si je déforme l'une des lignes de configfile, il ne les supprimera pas ... où je me trompe?


@JDHellequin - c'est un nouveau problème et doit être traité dans une nouvelle question. [ grin ] ///// cela mis à part, un truc avec Select-String est qu'il ne renvoie PAS une chaîne simple - il renvoie un objet de correspondance. vous devrez peut-être convertir cela en une simple chaîne pour la rendre utile dans vos autres étapes.


J'en ai fini avec ça, mais ça marche ... github.com/JDHarlequin/zabbix_scripts


@JDHellequin - sympa! ça marche ... et c'est toujours le point principal ... [ sourire ]