Скрипт PowerShell, который подсчитывает файлы и папки на нескольких серверах, а затем экспортирует вывод в файл CSV - PullRequest
0 голосов
/ 07 июня 2019

Я создаю сценарий PowerShell, который принимает список удаленных серверов и подсчитывает все файлы и папки на каждом диске каждого сервера в указанном списке.Кажется, код для подсчета файлов и экспорта в csv может быть отключен.

Ниже приведена текущая итерация сценария, который я разработал:

#variable used to call the list of R servers
$ServerList = 'H:\R_SERVER_COUNT\AllServerNames.txt'

# Loops through all the servers on list
foreach ($server in Get-Content $ServerList) {
    $count = Get-ChildItem -r "$server\"

    $fcount = Get-WmiObject Win32-LogicalDisk -ComputerName '$server' |
              Select-Object @{Label="Server";Expression={$_.SystemName}},
                  @{Label="Drive";Expression={$_.DeviceID}},
                  @{Label="Files";Expression={($count | ? {$_.PSIsContainer -eq $false}).Count}},
                  @{Label="Folders";Expression={($count | ? {$_.PSIsContainer -eq $true}).Count}}
    $folderAndFileCount += $fcount
}

#creates a csv file and places it into folder
$folderAndFileCount |
    Export-Csv 'H:/R_SERVER_COUNT/FolderAndFileCount.csv' -NoTypeInformation -Encoding UTF8

Что я ожидаю, так это CSVфайл, содержащий имя сервера, имя диска, количество файлов и количество папок.В настоящее время я получаю .

1 Ответ

0 голосов
/ 07 июня 2019

хотя я думаю, что Робокопия, вероятно, будет лучшим решением (обычно это по крайней мере на порядок быстрее), это подойдет. обратите внимание, что я -Recurse закомментировал во время тестирования. вам нужно будет снова включить это для реальной вещи. [ ухмылка ]

это использует Invoke-Command для запуска на целевых системах параллельно . он игнорирует неотвечающие системы, но если они вам нужны, вы можете получить имена, сравнив список ввода с ответчиками.

вы также, вероятно, захотите использовать Select-Object для удаления обычно нежелательных свойств, добавленных Invoke-Command [PSComputerName, RunspaceID и т. Д ...].

#requires -RunAsAdministrator

$ComputerNameList = @'
LocalHost
10.0.0.1
127.0.0.1
BetterNotBeThere
'@ -split [System.Environment]::NewLine

$IC_ScriptBlock = {
    $DriveList = Get-PSDrive -PSProvider 'FileSystem' |
        # exclude read-only devices such as ROM drives
        Where-Object {$_.Free -gt 0}

    foreach ($DL_Item in $DriveList)
        {
        $GCI_Params = @{
            LiteralPath = $DL_Item.Root
            # while testing, leave the "-Recurse" paramter out
            #Recurse =  $True
            ErrorAction = 'SilentlyContinue'
            Force = $True
            }
        $DF_Info = Get-ChildItem @GCI_Params
        $DirInfo = $DF_Info.Where({$_.PsIsContainer})
        [PSCustomObject]@{
            SystemName = $env:COMPUTERNAME
            Drive = $DL_Item.Root.Trim('\')
            DirCount = $DirInfo.Count
            FileCount = $DF_Info.Count - $DirInfo.Count
            }
        }
    }
$IC_Params = @{
    ComputerName = $ComputerNameList
    ScriptBlock = $IC_ScriptBlock
    ErrorAction = 'SilentlyContinue'
    }
$RespondingSystems = Invoke-Command @IC_Params

$RespondingSystems

один диск из одной системы ...

SystemName     : [MySysName]
Drive          : C:
DirCount       : 13
FileCount      : 3
PSComputerName : LocalHost
RunspaceId     : 0c67f714-ae8a-4831-b647-b27bd73ce94d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...