创建自动文件移动脚本的困难(Powershell)

时间:2013-04-14 12:12:41

标签: powershell automation backup

我首先要说的是我对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"}

OUTPUT?

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

如果有人能够帮助我完成这项工作的话,我会很高兴!

提前谢谢。

3 个答案:

答案 0 :(得分:0)

你错过了关闭的空间。它应该是:

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

为了确保使用corectly use()所以你的语句将是:

 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")并在名称中填写您需要的内容

答案 1 :(得分: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" }

答案 2 :(得分: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'}