Проверка пронумерованных переменных в PowerShell - PullRequest
0 голосов
/ 08 июня 2018

Я пишу скрипт для генерации текстового файла на основе предоставленных пользователем значений переменных.Переменные предоставляются через другое приложение, и они входят в Windows как переменные среды.

Итак, у меня есть следующее:

[hashtable]$variables = @{InstallPath = $env:InstallPath; ADBaseOUValue1 = $env:ADBaseOUValue1; ADBaseOUValue2 = $env:ADBaseOUValue2; LDAPQueryValue1 = $env:LDAPQueryValue1; LDAPQueryValue2 = $env:LDAPQueryValue2}

Эта хеш-таблица урезана, пользователь может определить до 15 ADBaseOU и 15 запросов LDAP, и есть другие переменные, но ни одна из нихпронумерованы.

Теперь мне нужно проверить данные.

  1. Мне нужно убедиться, что ADBaseOUValue1 и LDAPQueryValue1 не равны нулю
  2. Мне нужно убедиться, что ADBaseOUValue1 соответствует шаблону регулярных выражений
  3. Мне нужно убедиться, что, если в LDAPQueryValue1 есть амперсанды (&), за которыми не стоит «amp;», то я заменяю их
  4. Затем мне нужно выполнить обе проверки 2 и 3 для любых ADBaseOUValue # и LDAPQueryValue #, предоставленных пользователем.

Я выполняю проверку данных для других переменных (например, $ env: InstallPath), чтобы убедиться, что они не равны NULL и имеют ожидаемые типы данных.

В переменных $env: ADBaseOUValue2 до 15 и $ env: LDAPQueryValue2 до 15, как бы я:

  1. Определить имя переменной при выполнении проверки «If» по ее регулярному выражению
  2. Определить имя переменнойпри выполнении «замены» для «&»

Как только переменные будут проверены, значения перейдут в строку Here вроде:

<setting name="ADBaseOU1" serializeAs="String">
    <value>$env:ADBaseOUValue1</value>
</setting>
<setting name="ADBaseOU2" serializeAs="String">
    <value>$env:ADBaseOUValue2</value>
</setting>

Спасибо, вот что яесть прямо сейчас (для Vчасть алидации):

Switch ($variables.GetEnumerator()) {
    {($_.Name -eq "ADBaseOUValue1") -and ($_.Value -ne $null)} {
        If ($env:ADBaseOUValue1 -notmatch $ldapUrlRegex) {
            Write-Host ("{0}: The variable `"{1}`" was not a valid LDAP URL. Please re-run the script and provide a valid value for the variable." -f (Get-Date -Format s), $_.Name)

            $variableErrorCount++
        }
    }
    {($_.Name -eq "ADBaseOUValue1") -and ($_.Value -eq $null)} {
        If ($env:ADBaseOUValue1 -notmatch $ldapUrlRegex) {
            Write-Host ("{0}: The variable `"{1}`" was null. Please re-run the script and provide a value for the variable." -f (Get-Date -Format s), $_.Name)

            $variableErrorCount++
        }
    }
    {($_.Name -match "ADBaseOUValue(\d+)$") -and ($_.Name -ne "ADBaseOUValue1") -and ($_.Value -ne $null)} {
        If ($env:ADBaseOUValue1 -notmatch $ldapUrlRegex) {
            Write-Host ("{0}: The variable `"{1}`" was not a valid LDAP URL. Please re-run the script and provide a valid value for the variable." -f (Get-Date -Format s), $_.Name)

            $variableErrorCount++
        }
    }
    {($_.Name -eq "LDAPQueryValue1") -and ($_.Value -ne $null)} {
        If ($env:LDAPQueryValue1 -notmatch "&amp;") {
            Write-Host ("{0}: Replacing `"&`" with `"&amp;`" in {1}." -f (Get-Date -Format s), $_.Name)

            $env:LDAPQueryValue1 = $env:LDAPQueryValue1.Replace("&", "&amp;")
        }
    }
    {($_.Name -eq "LDAPQueryValue1") -and ($_.Value -eq $null)} {
        If ($env:ADBaseOUValue1 -notmatch $ldapUrlRegex) {
            Write-Host ("{0}: The variable `"{1}`" was null. Please re-run the script and provide a value for the variable." -f (Get-Date -Format s), $_.Name)

            $variableErrorCount++
        }
    }
    {($_.Name -match "LDAPQueryValue(\d+)$") -and ($_.Name -ne "LDAPQueryValue1") -and ($_.Value -ne $null)} {
        If ($env:??? -notmatch "&amp;") {
            Write-Host ("{0}: Replacing `"&`" with `"&amp;`" in {1}." -f (Get-Date -Format s), $_.Name)

            $env:??? = $env:???.Replace("&", "&amp;")
        }
    }
}

1 Ответ

0 голосов
/ 08 июня 2018

Звучит так, как вам нужно: переменная косвенность , то есть для доступа к переменной окружения косвенно через имя, хранящееся в переменной ;Например:

$env:Foo = 'bar' # sample env. var.

$varName = 'Foo' # the name of that env. var to use for indirect access

# To GET the value, via PS drive Env:
(Get-Item Env:$varName).Value # same as: $env:Foo

# To SET the value:
Set-Item Env:$varName 'new value' # same as: $env:Foo = 'new value'

В контексте вашей команды:

# ...

{$_.Name -match "LDAPQueryValue(\d+)$") -and ($_.Name -ne "LDAPQueryValue1") -and ($_.Value -ne $null)} {
  $currVal = (Get-Item Env:$($_.Name)).Value
  If ($currVal -notmatch "&amp;") {
      Write-Host ("{0}: Replacing `"&`" with `"&amp;`" in {1}." -f (Get-Date -Format s), $_.Name)

      Set-Item Env:$($_.Name) $currVal.Replace("&", "&amp;")
  }
}

# ...
...