使用 Powershell 获取远程服务器上的文件夹大小

kay*_*ay5 2 powershell

我正在尝试获取远程计算机路径上的文件夹结构和每个文件夹大小。我能够获取文件夹结构,但无论我指定的任何文件夹路径如何,文件夹大小都会返回 901.00 KB 的标准数字。我可以看到脚本能够正确获取远程文件夹路径,但不能正确获取文件/文件夹大小。

这是我到现在为止想出的代码。

param(
    [Parameter(ValueFromPipeline=$True, Mandatory=$True)]
    [System.String] $ComputerName,
    [Parameter(ValueFromPipeline=$True, Mandatory=$True, ValueFromPipelineByPropertyName=$true)]
    [ValidateNotNullOrEmpty()]
    [System.String] $Path
 )

function Get-FolderSize ($_ = (get-item .))  {
Process {
$RemoteServer = @($ComputerName)
ForEach($Computer in $ComputerName) {
$ErrorActionPreference = "SilentlyContinue"
$length = Invoke-Command -ComputerName $ComputerName { (Get-ChildItem $_.fullname -recurse | Measure-Object -property length -sum).sum 
} -ArgumentList $Path
$obj = New-Object PSObject
$obj | Add-Member NoteProperty Folder ($_.FullName)
$obj | Add-Member NoteProperty Length ($length)
Write-Output $obj

  }
 }
}

Function Class-Size($size)
{
 IF($size -ge 1GB)
 {
  "{0:n2}" -f  ($size / 1GB) + " GB"
 }
 ELSEIF($size -ge 1MB)
{
  "{0:n2}" -f  ($size / 1MB) + " MB"
}
ELSE
{
  "{0:n2}" -f  ($size / 1KB) + " KB"
}
} 

Get-ChildItem $Path | Get-FolderSize | Sort-Object -Property Length -Descending | Select-Object -Property Folder, Length |
Format-Table -Property Folder, @{ Label="Size of Folder" ; Expression = {Class-Size($_.Length)} }
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

提前致谢!!

Avs*_*lom 6

  1. 你的ComputerName参数是[String]但它应该是一个[Array]
  2. 您调用了Invoke-Commandwith $ComputerName,您应该在 foreach 循环中只调用一台计算机-ComputerName $Computer
  3. 也叫$_.FullName错了
  4. Class-Size 并不是真正需要的,您可以直接从 invoke-command 使用格式化,但这取决于您。
  5. 还有更多...检查更新的脚本

    Param(
    [Parameter(ValueFromPipeline=$True, Mandatory=$True)]
    [Array] $Computers,
    [Parameter(ValueFromPipeline=$True, Mandatory=$True, ValueFromPipelineByPropertyName=$true)]
    [ValidateNotNullOrEmpty()]
    [System.String] $Path
    )
    
    Function Class-Size($size)
    {
    IF($size -ge 1GB)
    {
    "{0:n2}" -f  ($size / 1GB) + " GB"
    }
    ELSEIF($size -ge 1MB)
    {
    "{0:n2}" -f  ($size / 1MB) + " MB"
    }
    ELSE
    {
    "{0:n2}" -f  ($size / 1KB) + " KB"
    }
    } 
    
    function Get-FolderSize 
    {
    Param(
    $Path, [Array]$Computers
    ) 
    $Array = @()
    Foreach($Computer in $Computers)
        {
        $ErrorActionPreference = "SilentlyContinue"
    
    $Length = Invoke-Command -ComputerName $Computer -ScriptBlock {
     (Get-ChildItem $args[0] -Recurse | Measure-Object -Property Length -Sum).Sum
    
    } -ArgumentList $Path
    
    $Result = "" | Select Computer,Folder,Length
    $Result.Computer = $Computer
    $Result.Folder = $Path
    $Result.Length = Class-Size $length
    $array += $Result
    
    }
    
    return $array
    }
    
    Get-FolderSize -Computers $Computers -Path $Path
    
    Run Code Online (Sandbox Code Playgroud)

运行它:

.\Get-Size.ps1 -Computers Computer1,Computer2 -Path c:\windows\system32

Computer     Folder              Length 
--------     ------              ------ 
Computer1    c:\windows\system32 2.96 GB
Computer2    c:\windows\system32 3.43 GB
Run Code Online (Sandbox Code Playgroud)