我想创建一个脚本,在两个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
如果你能帮助我解决这个问题,我将非常感激。
答案 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'