【问题标题】:Comparing and finding the missing result比较并找到缺失的结果
【发布时间】:2019-10-24 19:40:15
【问题描述】:

我有一个程序可以读取我的 Excel 表格并从网站下载附件。然后将其保存到具有特定名称的特定文件夹中,该名称在 Excel 工作表中具有我的名称。例如,

Column A - Column B
G135 - image01
G135 - image 02
G241 - document01
G748 - document01

A 列是指文件夹名称,程序将在其中创建一个具有上述名称的新文件夹。 B列是指程序正在保存到特定文件夹中的文件的名称。

我的程序并不完美,当我通过右键单击>属性计算所有文件夹中的文件数时,缺少一个文件。

如何将我的 Excel 工作表与我的文件夹进行比较以找到丢失的文件?

【问题讨论】:

    标签: excel powershell


    【解决方案1】:
    # Sample CSV data that simulates the contents of the Excel sheet.
    $csvData = @'
    ColumnA,ColumnB
    G135,image01
    G135,image02
    G241,document01
    G748,document01
    '@
    
    # Set the dir. in which to look for the files.
    $refDir = '.'
    
    # Process each CSV row.
    # With a real CSV file as input, you'd use something like
    #    Import-Csv c:\user\excel.csv
    # instead of 
    #    $csvData | ConvertFrom-Csv
    $csvData | ConvertFrom-Csv | 
      ForEach-Object { 
        # Construct the path to look for...
        $path = '{0}\{1}' -f $_.ColumnA, $_.ColumnB
        # ... and test its existence:
        if (-not (Test-Path -LiteralPath $refDir\$path)) {
          # Output the missing path.
          [pscustomobject] @{ Missing = $path }
        }
      }
    

    上面输出一个或多个缺少路径的自定义对象;例如:

    Missing
    -------
    G241\document01
    

    【讨论】:

    • 您好,对不起,我很困惑。我把它写成 $csv = @‘c:\user\excel.csv’ @
    • @KimberKer:不要使用$csvData | ConvertFrom-Csv,而是使用Import-Csv c:\user\excel.csv - 请查看我的更新。
    • 我在使用 Import-Csv 时遇到错误,“无法绑定参数‘分隔符’。无法将值“文件夹\excel.csv”键入“System.Char”。错误:“字符串的长度必须正好是一个字符。”
    • @KimberKer:这意味着您不小心传递了 2 个参数,其中第二个是 folder\excel.csv,它被解释为 -Delimiter 参数的值,而不是-Path / -LiteralPath 参数 - 只传递 1 个参数 - 除非您需要其他参数,在这种情况下最好使用它们的名称;例如,Import-Csv -LiteralPath folder\excel.csv -Delimiter ','
    • 我收到“您必须指定 -Path 或 -LiteralPath 参数,但不能同时指定两者。”这是我的代码 Import-Csv -LiteralPath C:\Users\Desktop\New Folder\excel.csv -Delimiter ‘,’ | foreach-object ...
    【解决方案2】:

    为避免安装处理 Excel 或使用 COMObjects 的模块,请将电子表格的副本另存为 CSV,我们将其命名为 mydata.csv。我将调用所有这些其他目录都是 c:\basedir 的目录。我还将假设每一列都有一个标题行(如果它不只是用于 CSV,您可以添加一个),并且 A 列是文件夹,B 列是文件名。这应该让您大致了解文件何时不在正确位置。

    $MyData = Import-Csv -Path mydata.csv
    
    Foreach ($File in $MyData) {
      $Location = Split-Path (Get-ChildItem -Path C:\basedir -Include $File.FileName -Recurse).DirectoryName -Leaf
      if ($File.Folder -ne $Location) {
        Write-Host "$($File.FileName) is in the wrong folder!"
        Write-Host "It should be in $($File.Folder) but it was found in $Location"
        Write-Host "----------------------------------------" # Just a visual separator
      }
      elseif ($null -eq $Location)  {
        Write-Host "$($File.FileName) was not found!"
      }
    }
    

    【讨论】:

    • 您好,如果我没记错的话,通过查看您的代码,您的代码是否会检查丢失的文件在哪里?因为我认为我的程序没有下载其中一个文件,因此缺少一个文件。我想知道哪个文件没有被下载
    • 对不起,我可能误解了你的问题,我会更新答案。
    • 我想将 C:\basedir 替换为包含文件文件夹的文件夹
    • @KimberKer 是的,我假设它们都在一个文件夹中,如下所示:C:\basedir\G135, C:\basedir\G241, C:\basedir\G748
    • 他们给我的结果是在错误的文件夹中!它应该在但它在“文件夹名称的完整列表”中找到
    【解决方案3】:

    假设您比较文件名(而不是完整路径)。你应该比较这样的东西:

    $MyFolderFiles = (Get-ChildItem -path "c:").Name
    $MyExcelList = Some code here to generate the file names list
    
    Compare-Object -ReferenceObject $MyFolderFiles -DifferenceObject $MyExcelList
    

    当然,您需要根据实际情况进行调整

    【讨论】:

    • (Get-ChildItem -path "c:").Name 返回位于目标目录中直接的文件的名称,而电子表格数据引用跨子目录的文件。
    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多