用于检查用户PC上是否存在文件夹的脚本,同时计算这些文件夹的文件

时间:2017-01-31 02:41:29

标签: powershell count

我想创建一个脚本,在两个PC名称(列出到systems.txt文件的名称)上检查是否存在2个文件夹(C:\ Program Files(x86)\ MS和C:\ Program Files \ MS)并计算该路径上有多少个文件。

由于我是初学者,我写的不仅仅是以下内容:

  Get-Content C:\reports\systems.txt | 
Select-Object @{Name='ComputerName';Expression={$_}},@{Name='MS Installed';Expression={ Test-Path "\\$_\c`$\Program Files (x86)\MS"}},@{Name='number of files';Expression={$numberp}}

  Get-Content C:\reports\systems.txt | `
   Select-Object @{Name='ComputerName';Expression={$_}},@{Name='MS Installed';Expression={ Test-Path "\\$_\c`$\Program Files (x86)\MS"}},@{Name='number of files';Expression={$numberp2}}

这返回了PC名称+'' true''如果文件存在或“假”''如果没有。除此之外,我如何计算每台PC的每条路径上包含的文件数量?

ComputerName      MS Installed     number of files
------------   ------------------- ---------------
PCname1                True              0
PCname2                True              0
PCname3                True              0
PCname4                False             0

如果你能帮助我解决这个问题,我将非常感激。

1 个答案:

答案 0 :(得分:0)

让我们使用IO.DirectoryInfo enumeration(自.NET框架4以来可用,它自Win 8/10开始内置; Win7 / XP上为installable),这比网络路径上的Get-ChildItem快得多。我们将使用普通循环语句计算项目数,这比测量对象更快,同时作为内存效率,因为我们不在任何地方分配所有文件的数组。

Get-Content R:\systems.txt | ForEach {
    $pc = $_
    $numFiles = 0
    foreach ($suffix in '', ' (x86)') {
        $dir = [IO.DirectoryInfo]"\\$pc\c`$\Program files$suffix\MS"
        if ($dir.Exists) {
            foreach ($f in $dir.EnumerateFiles('*', [IO.SearchOption]::AllDirectories)) {
                $numFiles++
            }
            break
        }
    }
    [PSCustomObject]@{
        'ComputerName' = $pc
        'MS Installed' = $dir.Exists
        'Number of files' = $numFiles
    }
}

如果不需要.NET framework 4,请使用快速VisualBasic's FileIO.FileSystem assembly或慢速Get-ChildItem,以便上面的代码与古老的PowerShell 2兼容:

Get-Content R:\systems.txt | ForEach {
    $pc = $_
    $numFiles = 0
    foreach ($suffix in '', ' (x86)') {
        $dir = [IO.DirectoryInfo]"\\$pc\c`$\Program files$suffix\MS"
        if ($dir.Exists) {
            Get-ChildItem $dir -recurse -force | ForEach {
                $numFiles += [int](!$_.PSIsContainer)
            }
            break
        }
    }
    New-Object PSObject -Property @{
        'ComputerName' = $pc
        'MS Installed' = $dir.Exists
        'Number of files' = $numFiles
    }
} | Select 'ComputerName', 'MS Installed', 'Number of files'