0

我将首先说明我对 Powershell 很陌生,但据我所知,它可能非常强大。

话虽如此,我会具体说明问题。

我正在尝试编写一个注定要每天运行的 Powershell 脚本并检查许多特定文件夹的总大小,在每个文件夹中都有文件夹排序,比如说名称。我的目标是最终结果是一个检查这些文件夹大小的脚本,如果它超过了我预先设置的定义限制,它们的内容将被移动到预定义的目的地。这些文件将被移动到与之前相同名称的文件夹中。

到目前为止,这是我所得到的:

$Folder_A = "C:\Users\location_A"
$Folder_B = "C:\Users\location_B"
$Folder_C = "C:\Users\location_C"
if((get-childitem $Folder_A , $Folder_B , $Folder_C | where {$_.name -eq name_1-or $_.name -eq $Name_2} | measure-object -property length -sum).sum -gt 30000) {write-host "success"}

输出?

You must provide a value expression on the right-hand side of the '-eq' operator.
At line:1 char:63
+ if((get-childitem $input , $Temp , $Tiffs | where {$_.name -eq <<<<  I001 -or $_.name -eq I002} | measure-object -property length -sum).sum -gt 30000) {
write-host "success"}
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ExpectedValueExpression

如果有人能够帮助这件事取得进展,我会非常感谢它!

提前致谢。

4

3 回答 3

0

你在 where 闭包中缺少一个空格。它应该是:

where {$_.name -eq name_1 -or $_.name -eq $Name_2}

为确保正确使用 () ,您的声明将是:

 where {($_.name -eq name_1) -or ($_.name -eq $Name_2)}

更新 我的完整(测试)脚本来计算选定目录的总和:

$names = @("IIS", "IIS Express")
$folders = @("C:\Program Files", "C:\Program Files (x86)")
$x = (gci $folders | where {$names -contains $_.name})
$sum = (($x | %{(Get-ChildItem $_.FullName -recurse | Measure-Object -property length -sum)}) | Measure-Object -Property 'Sum' -Sum).sum
if($sum -gt 3000){write-host "success"}

在您的情况下:$folders = @("C:\Program Files", "C:\Program Files (x86)")替换为$folders = @("C:\Users\location_A", "C:\Users\location_B", "C:\Users\location_C")并在名称中放入您需要的内容

于 2013-04-14T12:20:41.803 回答
0

检查属性是否与多个引用中的任何一个匹配的规范方法是将引用字符串放入数组并检查数组是否包含属性值。您要检查的文件夹的名称也应该放入一个数组而不是单个变量中。

尝试这样的事情:

$src = @(
  "C:\Users\location_A",
  "C:\Users\location_B",
  "C:\Users\location_C"
)

$ref = @(
  "name_1",
  "name_2",
  ...
)

$found = [bool](Get-ChildItem $src `
  | ? { $ref -contains $_.Name } `
  | Measure-Object -property Length -sum `
  | ? { $_.sum -gt 30000 })

if ($found) { write-host "success" }
于 2013-04-14T13:17:11.797 回答
0

您可以使用目录数组作为路径。如果您使用 -Recurse(即使没有要递归的任何子目录),您可以将文件名列表指定为 -Include 参数的数组参数:

$Folders = 'C:\Users\location_A','C:\Users\location_B','C:\Users\location_C'
$Files = 'name_1','name_2'

if ((((get-childitem $Folders -Recurse -Include $files | select -ExpandProperty length) | measure -sum).sum) -gt 30000)
  {write-host 'Success'}
于 2013-04-14T16:02:38.530 回答