验证PowerShell中的编号变量

验证PowerShell中的编号变量,powershell,hashtable,powershell-4.0,indirection,Powershell,Hashtable,Powershell 4.0,Indirection,我正在编写一个脚本,根据用户提供的变量值生成一个文本文件。这些变量是通过另一个应用程序提供的,它们作为环境变量进入Windows 因此,我有以下几点: [hashtable]$variables = @{InstallPath = $env:InstallPath; ADBaseOUValue1 = $env:ADBaseOUValue1; ADBaseOUValue2 = $env:ADBaseOUValue2; LDAPQueryValue1 = $env:LDAPQueryValue1;

我正在编写一个脚本,根据用户提供的变量值生成一个文本文件。这些变量是通过另一个应用程序提供的,它们作为环境变量进入Windows

因此,我有以下几点:

[hashtable]$variables = @{InstallPath = $env:InstallPath; ADBaseOUValue1 = $env:ADBaseOUValue1; ADBaseOUValue2 = $env:ADBaseOUValue2; LDAPQueryValue1 = $env:LDAPQueryValue1; LDAPQueryValue2 = $env:LDAPQueryValue2}
此哈希表被截断,用户最多可以定义15个ADBaseOUs和15个LDAP查询,并且还提供了其他变量,但这些变量都没有编号

现在我需要验证数据

  • 我需要确保ADBaseOUValue1和LDAPQueryValue1不为null
  • 我需要确保ADBaseOUValue1与regex模式匹配
  • 我需要确保,如果LDAPQueryValue1后面没有“amp;”符(&),那么我将替换它们
  • 然后我需要对用户提供的任何ADBaseOUValue#和LDAPQueryValue#进行检查2和3
  • 我正在对其他变量(例如$env:InstallPath)进行数据验证,以确保它们不为null,并且具有预期的数据类型

    在变量$env:ADBaseOUValue2到15和$env:LDAPQueryValue2到15中,我将如何:

  • 在对其正则表达式执行“If”检查时定义变量名
  • 在执行“&”的“替换”时定义变量名
  • 验证变量后,值将进入如下字符串:

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

    听起来您需要的是变量间接寻址,即通过存储在变量中的名称间接访问环境变量;e、 g:

    在命令的上下文中:

    # ...
    
    {$_.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;")
      }
    }
    
    # ...
    

    这是一个有趣的问题,但它可以更加集中,以造福未来的读者。
    $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;")
      }
    }
    
    # ...