#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
проблема устранена, и теперь она работает корректно