【问题标题】:Create new Powershell Variable with Values from replace使用来自替换的值创建新的 Powershell 变量
【发布时间】:2019-05-29 01:49:54
【问题描述】:

我需要一些有关 Powershell 脚本的帮助,该脚本从文本文件中读取指定行并使用 txt 文件中的值创建一个新变量。变量名应该是 $var1,值应该是 $var2。

新创建的变量的值应该是这样的

$number = 4
$Computername = "Test123$number"
$txt = Get-Content -Path .xyz.txt | Where-Object {$_ -like '@set*'}

foreach ($line in $txt){
    $firstclip=$line.IndexOf("(")
    $delimiter=$line.IndexOf(",")
    $lastclip=$line.IndexOf(")")

    $var1=$line.Substring($firstclip+1,$delimiter - ($firstclip + 1))
    $var2=$line.Substring($delimiter+1,$lastclip - ($delimiter + 1))
    $var2=$var2 -replace '%([^-]+)%','$$$1'

    Write-Host $var1
    Write-host $var2

    #New-Variable -Name $var1 -Value $var2
}

TXT文件内容.xyz.txt:

@Set(DeviceID, 11)
@Set(ComputerName, PC-Name-%DeviceID%)

@Set(Nic0Name, LAN)
@Set(Nic0Ip, 10.42.50.101)
@Set(Nic0Mask, 255.255.255.0)
@Set(Nic0Gateway, 10.42.50.50)

@Set(AmsNetId, %Nic0Ip%.1.1)

@Set(AmsRoute0Name, PC-NAME-01)
@Set(AmsRoute0Ip, 10.42.50.51)
@Set(AmsRoute0AmsNetId, %AmsRoute0Ip%.1.1)

@Set(VAS, 10.42.50.42)
@Set(IEHomePage, http://%VAS%/web/PC-0%DeviceID%.html)

@Set(IEPath, "C:\Program Files\Internet Explorer\iexplore.exe")

其实Value是Test123$number,所以Powershell不会把$number转换成之前在变量中声明的数字。

【问题讨论】:

  • 这是一种处理变量的糟糕技术。您应该考虑改用数组或哈希表。如果你真的想使用这种方法,那么你应该从文本文件中发布一些示例内容,以便人们可以看到你的代码正在处理什么。
  • 请将您正在使用的文件之一的内容添加到您的原始帖子中。
  • 感谢您添加 TXT 文件信息。 [grin] 现在,您如何将 %SomeNameHere% 信息输入 PoSh - 或者您是否希望保持不变?
  • 这正是我的问题。我想用 %SomeNameHere% 用新创建的变量中的值更改文本文件中的值。所以变量计算机名应该是值 PC-Name-$DeviceID。如果我检查 $deviceid 的值,它工作正常。但是,如果我为 $computername 设置值,那么它将返回我 PC-Name-$DeviceID 而不是 PC-NAME-11

标签: powershell


【解决方案1】:

我会使用 -split 运算符和备用运算符来处理输入行,
并检查 if 和 RegEx 是否有 %var% 可以替换为当前的 $var 内容。

EDIT:为了更好地可视化更改,输出[PSCustomObject]
EDIT2:需要使用 -AllMatches 切换到 Select-String

## Q:\Test\2019\05\20\SO_56218447.ps1

$txt = Get-Content -Path .xyz.txt | Where-Object {$_ -like '@set*'}
$RE = '%([^%]+)%'

foreach ($line in $txt){
    $Name,$Value = ($line -split '\(|\)|, ')[1,2]
    $NewValue = $Value
    ($Value)|Select-String -Pattern $RE -AllMatches | ForEach-Object {$_.Matches}|ForEach-Object{
        $NewValue = $NewValue -replace $_.value,(Get-Variable -Name $_.value.Trim('%')).Value
    }
    New-Variable -Name $Name -Value $NewValue
    [PSCustomObject]@{
        Variable = $Name
        Value    = $Value
        NewValue = $NewValue
    }
}

样本输出

> Q:\Test\2019\05\20\SO_56218447.ps1

Variable          Value                                             NewValue
--------          -----                                             --------
DeviceID          11                                                11
ComputerName      PC-Name-%DeviceID%                                PC-Name-11
Nic0Name          LAN                                               LAN
Nic0Ip            10.42.50.101                                      10.42.50.101
Nic0Mask          255.255.255.0                                     255.255.255.0
Nic0Gateway       10.42.50.50                                       10.42.50.50
AmsNetId          %Nic0Ip%.1.1                                      10.42.50.101.1.1
AmsRoute0Name     PC-NAME-01                                        PC-NAME-01
AmsRoute0Ip       10.42.50.51                                       10.42.50.51
AmsRoute0AmsNetId %AmsRoute0Ip%.1.1                                 10.42.50.51.1.1
VAS               10.42.50.42                                       10.42.50.42
IEHomePage        http://%VAS%/web/PC-0%DeviceID%.html              http://10.42.50.42/web/PC-011.html
IEPath            "C:\Program Files\Internet Explorer\iexplore.exe" "C:\Program Files\Internet Explorer\iexplore.exe"

【讨论】:

  • 感谢这是完美的解决方案!
  • 我刚刚发现一个值中有多个 %var% 的缺陷,我必须考虑一下。
  • CustomObjects的解决方案很不错,但是为什么%DeviceID%会变成%VAS%呢?通常 IEHomePage 应该看起来像 http://$Vas/dftweb/induction-0$deviceID.html
猜你喜欢
  • 2021-09-12
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
相关资源
最近更新 更多