Checking file names in a directory with entries in an excel spreadsheet; What am I doing wrong?

天大地大妈咪最大 提交于 2021-02-11 17:58:45

问题


I'm attempting to write a PowerShell script (my first ever, so be gentle) to go through all the file names in a directory and check if they exist in an excel spreadsheet that I have. If a file name does exist in both, I want to move/copy that file to a new directory.

Right now it runs with no errors, but nothing actually happens.

So far I have:

#open excel sheet
$objexcel=new-object -com excel.application
$workbook=$objexcel.workbooks.open("<spreadsheet location>")
#use Sheet2
$worksheet = $workbook.sheets.Item(2)

#outer loop: loop through each file in directory
foreach ($_file in (get-childitem -path "<directory to search>"))
{
    $filename = [system.IO.path]::GetFileNameWithoutExtension($_)

    #inner loop: check with every entry in excel sheet (if is equal)
    $intRowCount = ($worksheet.UsedRange.Rows).count
    for ($intRow = 2 ; $intRow -le $intRowCount ; $intRow++)
    {
        $excelname = $worksheet.cells.item($intRow,1).value2
        if ($excelname -eq $filename)
        { #move to separate folder
            Copy-Item -path $_file -Destination "<directory for files to be copied to>"
        }
        #else do nothing
    }
}
#close excel sheet
$workbook.close()
$objexcel.quit()

回答1:


You're trying to define $filename based on the current object ($_), but that variable isn't populated in a foreach loop:

$filename = [system.IO.path]::GetFileNameWithoutExtension($_)

Because of that $filename is always $null and therefore never equal to $excelname.

Replace the foreach loop with a ForEach-Object loop if you want to use $_. I'd also recommend to read the Excel cell values into an array outside that loop. That improves performance and allows you to use the array it in a -contains filter, which would remove the need for having a loop in the first place.

$intRowCount = ($worksheet.UsedRange.Rows).count
$excelnames = for ($intRow = 2; $intRow -le $intRowCount; $intRow++) {
  $worksheet.cells.item($intRow,1).value2
}

Get-ChildItem -Path "<directory to search>" |
  Where-Object { $excelnames -contains $_.BaseName } |
  Copy-Item -Destination "<directory for files to be copied to>"

On a more general note: you shouldn't use variable names starting with an underscore. They're too easily confused with properties of the current object variable ($_name vs. $_.name).



来源:https://stackoverflow.com/questions/31975583/checking-file-names-in-a-directory-with-entries-in-an-excel-spreadsheet-what-am

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!