将字符串搜索结果附加到现有csv文件

时间:2018-02-23 03:55:49

标签: powershell csv powershell-v2.0

我想在多个文件夹中搜索包含特定字符串的文件。每个文件夹的名称都列在具有单个标题(List1)的csv文件(thelist.csv)中。我想将搜索结果附加到thelist.csv,为FileName(Result1)和Directory(Result2)添加一列。我正在尝试进入csv文件(或excel表),以便最终确定哪些文件夹包含“TestString.txt”文件。

示例代码:

       $csv = Import-Csv  C:\The\Path\thelist.csv -Header List1, Results1, Results2
foreach ($line in $csv) {  
    $Results1= $line.Results1
    $Results2 = $line.Results2
    Get-ChildItem -Path "C:\The\Path" -Filter *TestString* -Recurse | Select List1, Results1, Results2  | Export-csv C:\The\Path\thelist2.csv -NoTypeInformation
} 

我成功搜索缺少的字符串会返回包括filename(result1)和directory(result2)在内的结果。但是,我遇到了将结果附加到csv文件的问题。现在我的代码从原始列表中返回(List1)的空值。原始csv文件中存在的唯一数据是标头。

1 个答案:

答案 0 :(得分:1)

您的代码正在尝试提取属性" List1,Results1,Results2"在文件名之外,没有任何代码告诉它如何做到这一点,所以它们是空的并且是空白的。

您正在尝试在循环内部执行导出,删除文件并为每次搜索覆盖它,因此它只会有一个结果。

您可能需要处理一个搜索返回多个匹配文件的情况,这需要向CSV添加新行。

我还没有尝试过这段代码,但这种方法应该更接近你想要的方式:

# Import from single column file, calling the column 'List1', and process each line:
Import-Csv -LiteralPath C:\The\Path\thelist.csv -Header List1 | ForEach-Object {

    # store line with a name, for use later on
    $Line = $_

    # the folders coming in from the CSV are in the column 'List1', search them
    Get-ChildItem -LiteralPath $Line.List1 -Filter *TestString* -Recurse | ForEach-Object {


        # for each search result TestString.txt, make a hashtable 
        # representing a new line in the output CSV, with the new data,
        # and convert to PS Custom Object so it will work with Export-CSV later on.

        [PSCustomObject]@{
            'List1' = $Line.List1
            'Result1' = $_.Name
            'Result2' = $_.DirectoryName
        }
    }

    # at the end of both loops, export all the results in one go
} | Export-csv C:\The\Path\thelist2.csv -NoTypeInformation