хотя я думаю, что Робокопия, вероятно, будет лучшим решением (обычно это по крайней мере на порядок быстрее), это подойдет. обратите внимание, что я -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