我正在编写一个powershell脚本,它接收存储在csv文件中的电话号码。 csv文件有"采取"字段,表示电话号码正在使用中。现在,我有一个简单的foreach循环,它读取了take字段的值并将no
更改为yes
:
Import-Csv '\\papertransport.com\files\UserDocuments\mneis\Code\phone_numbers2.csv' | ForEach-Object
{
if ($_.taken -eq 'no')
{
$_.taken = 'yes'
break
}
$_
} | Export-Csv \\papertransport.com\files\UserDocuments\mneis\Code\phone_numbers.csv -NoTypeInformation
我的问题是:我怎样才能获得它,以便当它遇到第一个no时循环停止?休息显然不起作用。此外,是否可以写入相同的csv文件而不是写入第二个?当我写入原文时,它会删除其中的所有值。
答案 0 :(得分:1)
要获取循环,请将break
替换为return
,或将代码更改为以下内容。
可以写入同一个文件;也在下面的代码中。我建议您备份现有文件,以确保不会丢失任何数据。添加了一个try / catch语句来执行该操作,如果无法创建副本,则停止脚本(您还可以看到return
正在运行)
$myFile = '\\papertransport.com\files\UserDocuments\mneis\Code\phone_numbers2.csv'
$backup = '\\papertransport.com\files\UserDocuments\mneis\Code\$((Get-Date).ToString"yyyyMMdd")_phone_numbers2.csv'
try{
Copy-item $myFile $backup -ErrorAction Stop
}catch{
Write-Host "File could not be copied"
return;
}
$phoneNumbers = Import-Csv $myFile
Foreach($number in $phoneNumbers)
{
if ($number.taken -eq 'no')
{
$number.taken = 'yes'
break
}
# you will need to ensure all of the headers in your original file are here, otherwise they will not be in your output file
[array]$myNewPhoneNumbers += New-Object psobject -Property{
taken = $number.taken
FirstHeader = $number.FirstHeader
SecondHeader = $number.SecondHeader
}
}
$myNewPhoneNumbers | Export-Csv '\\papertransport.com\files\UserDocuments\mneis\Code\$((Get-Date).ToString"yyyyMMdd")_phone_numbers.csv'
# I would recommend ensuring the code works how you want before uncommenting this.
#$myNewPhoneNumbers | Select-Object FirstHeader, SecondHeader, ThirdHeader |Export-Csv $myFile -Force