предварительный цикл по строке из csv-файла в powershell не работает

#powershell #shell #csv

#powershell #оболочка #csv

Вопрос:

У меня есть скрипт, над которым я работал для генерации некоторых XML-файлов, он работает, как ожидалось, когда я запускаю его только с 2 строками в CSV, когда я добавляю больше строк, он просто объединяет значения вместо цикла. Например, последняя строка предназначена для сохранения файла с 12345678.xml файл и вместо этого называет его номерами из всех строк. пример 12345678 25789654 45658965 46982268.xml Это выполняется со всеми строками в цикле. Мне нужна помощь, чтобы выполнить цикл по каждой строке и создать по 1 файлу на строку вместо того, чтобы перебирать данные из всех строк. Он должен повторяться 4 раза, сохраняя 4 файла вместо 1 файла со всеми объединенными данными.

  #Define the source CSV with the list of MAC address and Phone Numbers 
#$sourceCSV = Import-Csv "C:usersbobDesktopphones.csv" 

 
$xmltemp = Get-Content C:usersbobDesktopxmltemp.xml


#Pull first 13 lines of the XML Temp as variable chunk1
$chunk1 = $xmltemp | Select-Object -First 11

#Select lines 15 to 20 of the XML Temp as variable chunk2
$chunk2 = $tdcxmltemp | Select-Object -First 6 -skip 10

#Select lines 22 to 116 of the XML Temp as variable chunk3
$Chunk3 = $tdcxmltemp | Select-Object -First 95 -skip 11

#Select lines 120 to eof of the XML Temp as variable chunk4
$Chunk4 = $tdcxmltemp | Select-Object  -skip 119



#Loop to combine the data, and generate a MACaddress.xml for each MAC listed in the CSV file
Import-Csv "C:usersbobDesktopphones.csv" | ForEach-Object {

    foreach ($phone in $_.PSObject.Properties.mac){

            
                $phonenum = $sourceCSV.number
                $phonemac = $sourceCSV.mac
                $update = $sourceCSV.update_server
                    

# combine the first 13 lines of the script and Append phone number on line 13, add lines 15-20 into variable "xml2"
$xml2 = $chunk1   ("<!-- Configuration file for Line "   $phonenum   " -->")   $chunk2


#Add Update server to xml2 variable and create xml3 variable, combine with chunk 3
$xml3 = $xml2   ('          <update_server source="STATIC">'   $updater   "</update_server>")   $Chunk3


#combine xml3 veriable with line 117 - append phone number (line_id) into variable xml4
$xml4 = $xml3   ('              <line_id>'   $phonenumr   "</line_id>") 


#combine xml4 veriable with line 118 - append phone number (label) into variable xml5
$xml5 = $xml4   ('              <label>'   $phonenum   "</label>")


#combine xml5 veriable with line 119 - append phone number (sip_name) into variable xml6
$xml6 = $xml5   ('              <sip_name>'   $phonenumr   "</sip_name>")


#Combine xml6 veriable with chunk4 into variable xml7
$xml7 = $xml6   $chunk4 


#save the xml file and name with macadress 
$xml7 | Out-File ('C:usersbobDesktop'    $phonemac    '.xml')
}
}
  

CSV-файл

     mac,number,update_server
12345678,444-2223,192.168.1.1
25789654,1234567,192.168.1.1
45658965,7654321,192.168.1.1
46982268,99999999,192.168.1.1
  

Ответ №1:

Я не совсем уверен, но я думаю, что вместо этого …

 Import-Csv "C:usersbobDesktopphones.csv" | ForEach-Object {

    foreach ($phone in $_.PSObject.Properties.mac){

        $phonenum = $sourceCSV.number
        $phonemac = $sourceCSV.mac
        $update = $sourceCSV.update_server

        ...

        #save the xml file and name with macadress 
        $xml7 | Out-File ('C:usersbobDesktop'    $phonemac    '.xml')

    }

}
  

… возможно, вам просто нужно это:

 Import-Csv "C:usersbobDesktopphones.csv" | ForEach-Object {

    $phonenum = $_.number
    $phonemac = $_.mac
    $update   = $_.update_server

    ...

    #save the xml file and name with macadress 
    $xml7 | Out-File ('C:usersbobDesktop'    $phonemac    '.xml')

}
  

Обратите внимание, что в вашем исходном примере $sourceCSV.mac это массив, содержащий значение mac свойства из каждой записи в csv-файле, т.Е. @(12345678, 25789654, 45658965, 46982268) — поэтому при вычислении PowerShell 'C:usersbobDesktop' $phonemac '.xml' он принимает массив и перечисляет каждый элемент с пробелом между ними:

 $csv = @"
mac,number,update_server
12345678,444-2223,192.168.1.1
25789654,1234567,192.168.1.1
45658965,7654321,192.168.1.1
46982268,99999999,192.168.1.1
"@

$data = $csv | ConvertFrom-CSV

$phonemac = $data.mac
$phonemac
# 12345678
# 25789654
# 45658965
# 46982268

"C:usersbobDesktop"    $phonemac    ".xml"
# C:usersbobDesktop12345678 25789654 45658965 46982268.xml
  

Комментарии:

1. Спасибо, я думаю, что это также устранило бы проблему, я только что запустил ее, я думаю, что мы публикуем одновременно.

Ответ №2:

Мне объяснили, что foreach присваивает данные для $ phone каждой итерации. изменение $sourceCSV.number на $phone.number решило проблему. подробнее:

  foreach ($phone in $sourceCSV){
  

Изменение

 $phonenum = $sourceCSV.number
$phonemac = $sourceCSV.mac
$update = $sourceCSV.update_server
  

Для

  $phonenum = $phone.number
 $phonemac = $phone.mac
 $update = $phone.update_serve
  

проблема устранена, и теперь она работает корректно