使用PowerShell第2部分

时间:2016-08-11 14:28:24

标签: powershell

我仍然在尝试动态地将包含某些数据的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;

1 个答案:

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