代码之家  ›  专栏  ›  技术社区  ›  Bennett Dill

PowerShell脚本-获取子项

  •  4
  • Bennett Dill  · 技术社区  · 15 年前

    我已经编写了一个脚本,用于从服务器归档日志文件。我的状态很好,除了递归性和否 Get-ChildItem

    我遇到的问题是,当get childitem不是递归的 -Include 只存在一个筛选器,它被忽略!或者,我做错了什么(可能)。

    我已经清理了一点输出…

    PS C:\foo> Get-childitem -path "c:\foo"
    
    Name
    ----
    bar1.doc
    bar2.doc
    bar3.doc
    foo1.txt
    foo2.txt
    foo3.txt
    
    PS C:\foo> Get-childitem -path "c:\foo" -Include *.txt
    PS C:\foo> Get-childitem -path "c:\foo" -Include *.txt -recurse
    
    Name
    ----
    foo1.txt
    foo2.txt
    foo3.txt
    

    Sooo?你说什么?我有一个幻想,我所要做的只是分支到一个没有递归开关的脚本路径。(顺便问一下,是否可以可变地应用参数,以避免重复的代码路径,其中唯一的可变性是Cmdlet的参数?)

    不管怎样,这里是我完整性的脚本,除了我关于get childitem的问题。

    function MoveFiles()
    {
        Get-ChildItem -Path $source -Recurse -Include $ext | where { $_.LastWriteTime -lt (Get-Date).AddDays(-$days) } | foreach {
            $SourceDirectory = $_.DirectoryName;
            $SourceFile = $_.FullName;
            $DestinationDirectory = $SourceDirectory -replace [regex]::Escape($source), $dest;
            $DestionationFile = $SourceFile -replace [regex]::Escape($source), $dest;
    
            if ($WhatIf){
                #Write-Host $SourceDirectory;
                #Write-Host $DestinationDirectory;
                Write-Host $SourceFile -NoNewline
                Write-Host " moved to " -NoNewline
                Write-Host $DestionationFile;
            }
            else{
                if ($DestinationDirectory)
                {
                    if ( -not [System.IO.Directory]::Exists($DestinationDirectory)) {
                        [void](New-Item $DestinationDirectory -ItemType directory -Force);
                    }
                    Move-Item -Path $SourceFile -Destination $DestionationFile -Force;
                }
            }
        }
    }
    
    3 回复  |  直到 10 年前
        1
  •  10
  •   hythlodayr    15 年前

    答案在命令的完整描述中(get-help get childitem-full):

    include参数有效 仅当命令包含 Recurse参数或路径导致 目录的内容,如 C:\windows\*,其中通配符 字符指定 C:\Windows目录。

    所以下面的工作不会再发生。

    PS C:\foo> Get-childitem -path "c:\foo\*" -Include *.txt
    
        2
  •  2
  •   x0n    15 年前

    这是预料中的行为,但无疑令人困惑。从get childitem帮助文件:

    -Include <string[]>
    

    仅检索指定的项。此参数的值限定了路径参数。输入路径元素或模式,如“*.txt”。允许使用通配符。

    只有当命令包含recurse参数或路径指向目录的内容(如c:\windows*)时,include参数才有效,其中通配符指定c:\windows目录的内容。

    PS>帮助目录-完整更多

    希望这有帮助,

    -奥辛

        3
  •  1
  •   Peter Mortensen TravisEz13    10 年前

    我不能告诉你确切的原因(但我会继续查找),但行为记录在get-help for get childitem中:

    -Include <string[]>
        Retrieves only the specified items. The value of this parameter qualifies the Path parameter. Enter a path elem
        ent or pattern, such as "*.txt". Wildcards are permitted.
    
        The Include parameter is effective only when the command includes the Recurse parameter or the path leads to th
        e contents of a directory, such as C:\Windows\*, where the wildcard character specifies the contents of the C:\
        Windows directory.