【问题标题】:How to get an object of multiple array using Powershell?如何使用 Powershell 获取多个数组的对象?
【发布时间】:2020-12-29 13:51:32
【问题描述】:

我有 2 个数组。我想映射数组然后获取数组的对象并将其用于重命名文件。 我试过这个。但是文件名不正确,因为它应该是数组的对象。

这是我得到一些信息的xml格式。

<?xml version="1.0" encoding="UTF-8"?>
<assign>
     <define>
          <systemid value="8537">
          <description crm="AE/PR" priority="0"/>
          <description crm="S1/W1/W2/ZH" priority="2"/>
          <description crm="AP" priority="3"/>
          </systemid>
     </define>
</assign>

$CRMs = @("AE", "S1", "AP")

     foreach ($c in $CRMs)
     {      
          $priority = $JobSequence.jobassignseq.userdefineseq.systemid | Where-Object {$_.value -like "*$SSID*"} |
          Select-Object -ExpandProperty description | Where-Object {$_.crm -like "*$c*"} | Select-Object -ExpandProperty priority
          Write-Host "Prio $priority"

          
          $check = $JobSequence.jobassignseq.userdefineseq.systemid | 
          Where-Object {$_.value -like "*$SSID*"} | Select-Object -ExpandProperty description | 
          Select-Object priority, crm | Where-Object {$_.priority -eq "$priority"} | Select-Object -ExpandProperty crm

          $C1 = $check | ForEach-Object {$_ -split "/"}
          Write-Host "CRM: $C1"
          
          $Job = (Get-ChildItem $PathOp\$Image\*.job)
          $C1 | ForEach-Object {
               for ($i = 0; $i -lt $C1.count;  $i++) {    
                    
                    $Job[$i] | Rename-Item -NewName {("$priority")[$i] + "`_$Date`_" + $_.Name.Replace('.job','.que')}
               }  

          }      
     } 

我的期望是优先级0 应该分配给带有 crm AE 或 PR 的文件,优先级 2 应该分配给带有 crm S1 或 W1 或 W2 或 ZH 的文件,优先级 3 应该分配给带有CRM AP。

任何人都可以帮助我,非常感谢。非常感谢

【问题讨论】:

    标签: arrays powershell multidimensional-array rename file-rename


    【解决方案1】:

    您有相当多的无关代码,您要么需要包括它是如何发挥作用的,要么要排除它。一项建议是利用 XML 的优势来获取您需要的信息。希望这个例子能引导你走向正确的方向。

    [xml]$xml = @'
    <?xml version="1.0" encoding="UTF-8"?>
    <assign>
         <define>
              <systemid value="8537">
              <description crm="AE/PR" priority="0"/>
              <description crm="S1/W1/W2/ZH" priority="2"/>
              <description crm="AP" priority="3"/>
              </systemid>
         </define>
    </assign>
    '@
    
    $description = $xml.SelectNodes("//description")
    

    $description 现在包含所有 3 个节点

    crm         priority
    ---         --------
    AE/PR       0       
    S1/W1/W2/ZH 2       
    AP          3 
    
    $CRMs = "AE", "S1", "AP"
    
    foreach($c in $CRMs)
    {
        "Priority for CRM {0} is {1}" -f $c,
            ($description | where crm -match $c | select -ExpandProperty priority)
    }
    

    有几点需要注意。

    为了便于阅读,我将传递给字符串格式表达式的第二个字符串放在下一行,因为逗号是自然换行符。

    列表周围的@() 不需要,它已经是一个数组。

    $CRMs = "AE", "S1", "AP"
    
    $CRMs.GetType().basetype.name
    
    Array
    

    【讨论】:

    • 嗨@Doug Maurer 谢谢你的建议。非常感谢。但我希望我可以将$Job 中的文件重命名为优先级和crm。如果你不介意,你能帮我给个建议吗?谢谢
    猜你喜欢
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2023-02-26
    • 1970-01-01
    相关资源
    最近更新 更多