在 PowerShell 中验证编号变量

Posted

技术标签:

【中文标题】在 PowerShell 中验证编号变量【英文标题】:Validating numbered variables in PowerShell 【发布时间】:2018-11-18 20:15:40 【问题描述】:

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

所以我有以下内容:

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

此哈希表被截断,用户最多可以定义 15 个 ADBaseOU 和 15 个 LDAP 查询,还提供了其他变量,但没有一个被编号。

现在我需要验证数据。

    我需要确保 ADBaseOUValue1 和 LDAPQueryValue1 不为空 我需要确保 ADBaseOUValue1 与正则表达式模式匹配 我需要确保,如果 LDAPQueryValue1 的和号 (&) 后面没有“amp;”,我将替换它们 然后,对于用户提供的任何 ADBaseOUValue# 和 LDAPQueryValue#,我需要同时检查 2 和 3。

我正在对其他变量(例如 $env:InstallPath)进行数据验证,以确保它们不为空并且具有预期的数据类型。

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

    在对其正则表达式执行“If”检查时定义变量名称 在“&”的“替换”时定义变量名

一旦变量被验证,值将进入一个 Here 字符串,如:

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

谢谢,这是我现在拥有的(用于验证部分):

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】:

听起来您需要的是变量间接,即通过存储在变量中的名称​​间接访问环境变量;例如:

$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;")
  


# ...

【讨论】:

以上是关于在 PowerShell 中验证编号变量的主要内容,如果未能解决你的问题,请参考以下文章

powershell 更新power shell中的帮助系统。第二个文件在Windows中显示帮助文件。第三个文件显示来自在线来源的帮助。

PowerShell ISE:调试从 power-shell 脚本调用的另一个 power-shell 脚本

如何使用Windows Power Shell

如何在Powershell中存储MFA凭证

如何从 Power BI 中的月份编号获取月份名称?

如何使用Windows Power Shell