使用powershell

时间:2017-05-23 15:57:40

标签: powershell csv

我正在编写一个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文件而不是写入第二个?当我写入原文时,它会删除其中的所有值。

1 个答案:

答案 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