使用PowerShell第2部分中的排序对象进行排序

使用PowerShell第2部分中的排序对象进行排序,powershell,Powershell,我仍然在尝试对CSV文件中的重复项进行排序,并将其从包含一些数据的逗号分隔的CSV文件中动态删除到新的CSV文件中。在-Property$SortByColNames的堆栈溢出成员之一的帮助下获得了进一步的信息,但现在我的问题在ForEach部分。如果我在花括号中硬编码ForEach的编号部分,在-f之后硬编码列名,那么我就可以工作了,但是如果我试图将这两个变量转换为从函数中的参数传递过来的变量,那么它会给我一个CSV文件,其中包含-f部分的物理字符串 我尝试将$ShowColsByNumber

我仍然在尝试对CSV文件中的重复项进行排序,并将其从包含一些数据的逗号分隔的CSV文件中动态删除到新的CSV文件中。在-Property$SortByColNames的堆栈溢出成员之一的帮助下获得了进一步的信息,但现在我的问题在ForEach部分。如果我在花括号中硬编码ForEach的编号部分,在-f之后硬编码列名,那么我就可以工作了,但是如果我试图将这两个变量转换为从函数中的参数传递过来的变量,那么它会给我一个CSV文件,其中包含-f部分的物理字符串

我尝试将$ShowColsByNumber设置为字符串和对象变量,将$ColumnValueFormat设置为字符串和对象。两者都不起作用

谁能帮忙吗

以下是有效的代码,之后是无效的代码:

工作

不起作用

[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;
这应该行得通

[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 ','
    }
使用原始值需要这样的内容。每次循环时都必须执行数组中的每个值。其中一种方法是使用调用表达式,这并不是一个好的实践

[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
这应该行得通

[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 ','
    }
使用原始值需要这样的内容。每次循环时都必须执行数组中的每个值。其中一种方法是使用调用表达式,这并不是一个好的实践

[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

您的替换将不起作用,因为您正在为$\u0.EmployeeID.Trim插入文字字符串。这不会被调用和扩展以添加到字符串中。您的替换将不起作用,因为您正在为$\ux.EmployeeID.Trim插入文字字符串。这不会被调用和扩展以添加到字符串中。嗨,Chris。谢谢你回复我。我还是有点困惑。我将以下行中的$ColumnValueFormat:ForEach{$ShowColsByNumber-f$ColumnValueFormat}替换为以下内容:选择对象及其位于花括号中的ForEach对象,但它抱怨$ShowColsByNumber。我该怎么做呢?Sort对象已经在为您排序值了。在本例中,ForEach对象中的部分正在处理trim。如果不进行一些相当繁琐的工作,将$ColumnValueFormat中的每个值转换为ScriptBlock,则无法使用现有版本。让我演示一下。对不起,我的意思是Select对象对值进行排序,对列进行排序,而不是对行进行排序。不管怎样,我已经添加了一种可能的方法,可以让原作按原样工作。我不认为使用调用表达式是很好的实践,更不用说了。它工作得很好。谢谢,非常感谢:-如果您有时间和/或想添加关于如何在不使用调用表达式的情况下执行此操作的评论,我们将不胜感激。再次感谢。嗨,克里斯。还有一个问题。如何以数字形式指定$ColumnValueFormat?所以安装了:[object]$ColumnValueFormat='$\.EmployeeID.Trim',FirstName.Trim'。。。类似于:[object]$ColumnValueFormat='$\[0].Trim','$\[1].Trim'可能有没有列标题的CSV文件。嗨,克里斯。谢谢你回复我。我还是有点困惑。我将以下行中的$ColumnValueFormat:ForEach{$ShowColsByNumber-f$ColumnValueFormat}替换为以下内容:选择对象及其位于花括号中的ForEach对象,但它抱怨$ShowColsByNumber。我该怎么做呢?Sort对象已经在为您排序值了。在本例中,ForEach对象中的部分正在处理trim。如果不进行一些相当繁琐的工作,将$ColumnValueFormat中的每个值转换为ScriptBlock,则无法使用现有版本。让我演示一下。对不起,我的意思是Select对象对值进行排序,对列进行排序,而不是对行进行排序。不管怎样,我已经添加了一种可能的方法,可以让原作按原样工作。我不认为使用调用表达式是很好的实践,更不用说了。它工作得很好。谢谢,非常感谢:-如果您有时间和/或想添加关于如何在不使用调用表达式的情况下执行此操作的评论,我们将不胜感激。再次感谢。嗨,克里斯。还有一个问题。如何以数字形式指定$ColumnValueFormat?所以安装了:[object]$ColumnValueFormat='$\.EmployeeID.Trim',FirstName.Trim'。。。类似于:[object]$ColumnValueFormat='$\[0].Trim','$\[1].Trim'可能存在没有列标题的CSV文件。