Как заменить строки в свойствах PSOBJECTS в массиве?
Вы делаете это для каждого объекта.
$thisIsTheArrayOfObjects | ForEach-Object {
$_.foo = $_.foo -replace "Old ID" , "New ID" # replace string in a property
$_ # output the object back onto the pipeline
}
Имейте в виду, что естьдве ошибки с -replace
:
- Работает с регулярным выражением. Технически вы должны выполнить regex-escape первый параметр (
[regex]::escape("Old ID")
), если вы хотите выполнить замену literal , если только «Old ID» не содержит символов, которые являются специальными в regex. Если это происходит от пользовательского ввода, всегда разумно избегать его. - Он не чувствителен к регистру.
Чтобы сделать буквенные замены с учетом регистра, используйте .NET-native String.Replace()
, который также доступен:
$thisIsTheArrayOfObjects | ForEach-Object {
$_.foo = $_.foo.Replace("Old ID", "New ID") # replace string in a property
$_ # output the object back onto the pipeline
}
Чтобы применить операцию к каждому столбцу в данных CSV, необходимо создать вложенный цикл. Командлет Get-Member
может помочь. Принцип остается тем же, что и выше.
Import-Csv "input.csv" -PipelineVariable row | ForEach-Object {
$row | Get-Member -MemberType NoteProperty -PipelineVariable col | ForEach-Object {
$colname = $col.Name
$row.$colname = $row.$colname -replace "Old ID", "New ID"
$row
}
} # | Export-Csv "output.csv"
Обратите внимание на использование переменных конвейера, чтобы обойти любую путаницу $_
внутри внутреннего цикла.