【问题标题】:Difficulties creating an automatic file moving script (Powershell)创建自动文件移动脚本(Powershell)的困难
【发布时间】:2013-04-06 14:35:36
【问题描述】:

我首先要说明我对 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

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

提前致谢。

【问题讨论】:

    标签: powershell automation backup


    【解决方案1】:

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

    【讨论】:

    • 是的,当我将脚本复制到论坛时,这只是一个错字,但谢谢。还有什么?你们觉得我应该怎么继续?
    • name_1 应该是$name_1。并且括号不是必需的,因为逻辑运算符的优先级低于比较运算符。
    • 嘿 Garath,感谢您的快速回答和出色的解决方案。我现在可以继续执行脚本的下一步,这会将文件移动到与它们所在的文件夹同名的文件夹中。我正在尝试自己找到它,但如果有人知道的话怎么连开始,我的感激都会更大! :) 谢谢大家。
    • 在 stackoverflow 上将响应标记为答案,您不必感谢
    【解决方案2】:

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

    试试这样的:

    $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" }
    

    【讨论】:

      【解决方案3】:

      您可以使用目录数组作为路径。 如果您使用 -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'}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-05
        • 2019-10-18
        • 1970-01-01
        • 2021-03-14
        相关资源
        最近更新 更多