【问题标题】:PowerShell - count accdb rows for all the files in folder at oncePowerShell - 一次计算文件夹中所有文件的 accdb 行数
【发布时间】:2016-01-13 00:36:57
【问题描述】:

我知道我可以计算一个 csv 有多少行,而无需使用 powershell 打开它。 示例:

import-csv C:\MyFolde\myfile.csv | Measure-Object

我需要为多个访问文件 (.accdb) 执行此操作。这次是给定文件夹中的每个(和所有)文件,然后我想对行求和(该文件夹中所有文件的总和)。有解决办法吗?

谢谢

【问题讨论】:

  • Access 文件有表(有记录),而不是行。
  • 假设每个访问文件只有一个记录表。
  • 另外,为了明确术语,当您使用 Import-CSV 时,文件肯定会被打开。
  • 我的意思是,不用我打开它。我相信你明白我想要什么。如果我能找到解决方案,那就太好了。因为打开每个访问文件并在文件中写入行数并在最后总结它们会花费很多时间
  • 这就是我的观点。例如,如果它们是一堆 CSV 文件,则所花费的时间与您明确打开并读取每个文件所花费的时间完全相同。没有魔法。要查看(计数)文件中的内容,请打开文件并查看它。 Access DB 文件也是如此。您需要使用 JET 驱动程序和 ADODB 连接并打开每个 DB 并查看它。

标签: powershell ms-access count powershell-3.0


【解决方案1】:

为了将来的访问者的利益,这里有一个 PowerShell 脚本,它计算指定文件夹中每个 .accdb 文件的非系统表中的所有行:

$connStrStub = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
$numFiles = 0
$numTables = 0
$totalRows = 0
foreach ($f in Get-ChildItem -Path C:\Users\Public\test\*.accdb)
{
    $numFiles++
    $conn = New-Object System.Data.OleDb.OleDbConnection ($connStrStub + $f.FullName)
    $conn.Open()
    $schemaTable = $conn.GetSchema("TABLES")
    foreach ($dtRow in $schemaTable)
    {
        $tblName = $dtRow["TABLE_NAME"]
        if (!$tblName.StartsWith("MSys"))
        {
            $numTables++
            $cmd = New-Object System.Data.OleDb.OleDbCommand "SELECT COUNT(*) AS n FROM [$tblName]", $conn
            $totalRows += $cmd.ExecuteScalar()
        }
    }
    $conn.Close()
}
write-output "files: $numFiles"
write-output "user_tables: $numTables"
write-output "total_rows: $totalRows"

【讨论】:

  • 这是一个很好的答案!谢谢!即使我已经解决了我的问题,我也会将您的答案标记为已接受,因为这是解决问题的好方法
【解决方案2】:

我放弃了尝试使用 powershell。 但是,我设法通过使用 SQl 服务集成服务来计算所有行。使用了一个 foreach (循环遍历所有文件),在循环内部有一个任务,该任务从每个文件中选择计数并将结果输出到 xls 中。

感谢大家的宝贵时间

【讨论】:

    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多