4

我编写了一个脚本,用于从服务器归档日志文件。除了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

呜呜???我有一个幻想,我所要做的就是分支到没有递归开关的脚本路径。(顺便说一句,是否可以可变地应用参数以避免重复的代码路径,其中唯一的可变性是 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;
            }
        }
    }
}
4

3 回答 3

10

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

Include 参数仅在命令包含 Recurse 参数或路径指向目录的内容时才有效,例如 C:\Windows\*,其中通配符指定 C:\Windows 目录的内容。

因此,以下内容无需递归即可工作。

PS C:\foo> Get-childitem -path "c:\foo\*" -Include *.txt
于 2009-09-02T21:33:28.893 回答
2

这是预期的行为,但诚然令人困惑。从 Get-ChildItem 帮助文件:

-Include <string[]>

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

Include 参数仅在命令包含 Recurse 参数或路径指向目录的内容时才有效,例如 C:\Windows*,其中通配符指定 C:\Windows 目录的内容。

ps>帮助目录-full | 更多的

希望这可以帮助,

-Oisin

于 2009-09-02T21:35:03.133 回答
1

我不能告诉你它的确切原因(但我会继续寻找),但该行为记录在 Get-ChildItem 的 Get-Help 中:

-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.
于 2009-09-02T21:30:11.927 回答