检索每个 IIS 站点的父文件夹大小

检索每个 IIS 站点的父文件夹大小

我尝试从 IIS (8.5) 获取包含文件夹大小的站点列表,但无法使其工作。

以下是我目前使用的代码,无需尺寸即可运行

Import-Module webAdministration # Required for Powershell v2 or lower  

$filepath = C:\sites.csv
$sites = get-website

foreach($site in $sites) {
    $name = $site.name
    $bindings = $site.bindings.collection.bindinginformation.split(":")
    $ip = $bindings[0]
    $port = $bindings[1]
    $hostHeader = $bindings[2]
    "$name,$hostHeader,$ip,$port" | out-host
    "$name,$hostHeader,$ip,$port" | out-file $filePath -Append
}

然后我尝试添加这一行

$size = Get-ChildItem -Directory -Force|ForEach {"{0,-30} {1,-30} {2:N2}MB" -f $_.Name, $_.LastWriteTime, ((Get-ChildItem $_ -Recurse|Measure-Object -Property Length -Sum -ErrorAction Stop).Sum/1MB)}

但那也不起作用。

然后我尝试

$size = Get-ChildItem $name + "\folderName\" | Measure-Object -Property Length -sum

已经很接近了,但我认为我的语法有误,$name + "\folderName\"因为我得到了一系列错误。我说这很接近,因为它有目录的路径,但它不存在。如果我可以将文件夹名称添加到变量中,目录会存在吗$name

我哪里做错了?或者我如何检索每个网站文件夹大小的父级?

答案1

在我的测试中,该PhysicalPath属性可以包含 cmd.exe 格式的变量%SystemDrive%

发生这种情况时,您可以获取物理路径并使用正则表达式提取环境变量名称和剩余路径。提取变量的值并构建路径。

$filepath = 'C:\sites.csv'
$sites = get-website

foreach($site in $sites) {
    if($site.physicalPath -match '^%(.+)%(.+)$'){
        $sitedir = Join-Path (Get-Content "env:$($matches.1)") $matches.2
        Get-ChildItem -LiteralPath $sitedir
    }
}

如果您确认这确实准确列出了每个站点的文件,则似乎您已经弄清楚了测量部分。

还有一些其他建议。首先,我建议使用Export-Csv而不是Out-File

接下来,您可以收集所有结果然后写入它们,而不是打开文件并一遍又一遍地添加(很慢)。

$results = foreach($site in $sitelist){
    ... code ...
}

$results | Out-File $filepath

或者您可以使用ForEach-Object并利用管道。

$sitelist | ForEach-Object {
    ... code ...
} | Out-File $filepath

的一个附带好处ForEach-Object是,该-OutVariable参数可让您捕获变量中的输出(即类型ArrayList)并查看输出(或将其通过管道传输到更多命令)。

考虑到我的建议,我会尝试一下。

$filepath = 'C:\sites.csv'
$sites = get-website

$sites | ForEach-Object {

    $ip, $port, $hostHeader = $_.bindings.collection.bindinginformation.split(":")

    $path = if($_.physicalPath -match '^%(.+)%(.+)$'){
        Join-Path (Get-Content "env:$($matches.1)") $matches.2
    }
    else{
        $_.physicalpath
    }

    $size = (Get-ChildItem $path -Recurse | Measure-Object -Property Length -Sum -ErrorAction Stop).Sum / 1MB

    [PSCustomObject]@{
        Name       = $_.name
        FullPath   = $path
        IP         = $ip
        Port       = $port
        HostHeader = $hostHeader
        SizeMB     = $size
   }
} -OutVariable results

$results | Export-Csv $filepath -NoTypeInformation

相关内容