我仍然在尝试动态地将包含某些数据的CSV文件(用逗号分隔)中的重复项排序并删除到新的CSV文件中。在-Property $ SortByColNames的堆栈溢出成员的帮助下得到了进一步的帮助,但现在我的问题出现在ForEach部分。如果我用大括号中的ForEach编号部分和" -f"之后的列名称进行硬编码,我就可以使用它。但如果我尝试将两个变为从函数中的参数传递的变量,它会给我一个包含-f部分的物理字符串的CSV文件。
我尝试将$ ShowColsByNumber作为字符串和对象变量,$ ColumnValueFormat也作为字符串和对象。都没有工作。
任何人都可以帮忙。
下面是有效的代码,之后的代码是:
作品
[string] $Source = 'e:\Temp\DataFromSkywardEdited.csv';
[string] $Destination = 'e:\Temp\DataFromSkywardRD.csv';
[object] $SortByColNames = 'LastName','FirstName';
Get-Content $Source |
ConvertFrom-Csv |
Sort -Property $SortByColNames -Unique |
ForEach {"{0},{1},{2},{3},{4},{5},{6},{7},{8}" -f $_.EmployeeID.Trim(), $_.FirstName.Trim(), $_.LastName.Trim(), $_.Location.Trim(), $_.Department.Trim(), $_.TelephoneNo.Trim(), $_.Email.Trim(), $_.EmpTypeCode.Trim(), $_.EmployeeTypeDescription.Trim()} |
Add-Content $Destination
不起作用
[string] $Source = 'e:\Temp\DataFromSkywardEdited.csv';
[string] $Destination = 'e:\Temp\DataFromSkywardRD.csv';
[object] $SortByColNames = 'LastName','FirstName';
[string] $ShowColsByNumber = "{0},{1},{2},{3},{4},{5},{6},{7},{8}";
[object] $ColumnValueFormat = '$_.EmployeeID.Trim()', '$_.FirstName.Trim()', '$_.LastName.Trim()', '$_.Location.Trim()', '$_.Department.Trim()', '$_.TelephoneNo.Trim()', '$_.Email.Trim()', '$_.EmpTypeCode.Trim()', '$_.EmployeeTypeDescription.Trim()';
Get-Content $Source |
ConvertFrom-Csv -Delimiter $Delimiter |
Sort -Property $SortByColNames -Unique |
ForEach {$ShowColsByNumber -f $ColumnValueFormat} |
Add-Content $Destination;
答案 0 :(得分:4)
这应该有用。
[String[]]$ColumnValueFormat = 'EmployeeID', 'FirstName', 'LastName' # Truncated, example.
Get-Content $Source |
ConvertFrom-Csv -Delimiter $Delimiter |
Sort-Object -Property $SortByColNames -Unique |
Select-Object $ColumnValueFormat |
ForEach-Object {
$_.PSObject.Properties.Value.Trim() -join ','
}
使用原始值需要这样的东西。每次循环时都必须执行数组中的每个值。其中一种方法是使用Invoke-Expression,这不是真正的好习惯。
[string] $Source = 'e:\Temp\DataFromSkywardEdited.csv';
[string] $Destination = 'e:\Temp\DataFromSkywardRD.csv';
[object] $SortByColNames = 'LastName','FirstName';
[string] $ShowColsByNumber = "{0},{1},{2},{3},{4},{5},{6},{7},{8}";
[object] $ColumnValueFormat = '$_.EmployeeID.Trim()', '$_.FirstName.Trim()', '$_.LastName.Trim()', '$_.Location.Trim()', '$_.Department.Trim()', '$_.TelephoneNo.Trim()', '$_.Email.Trim()', '$_.EmpTypeCode.Trim()', '$_.EmployeeTypeDescription.Trim()';
Get-Content $Source |
ConvertFrom-Csv -Delimiter $Delimiter |
Sort-Object -Property $SortByColNames -Unique |
ForEach-Object {
# Each of the values in $ColumnValueFormat must be executed to get the property from the loop variable ($_).
$values = foreach ($value in $ColumnValueFormat) {
Invoke-Expression $value
}
# Then the values can be passed in as an argument for the format operator.
$ShowColsByNumber -f $values
} |
Add-Content $Destination