Pergunta

Escrevi um script que será usado para arquivar arquivos de log de um servidor. Estou em muito boa forma com tudo, mas a recursividade ou não de Get-Childitem...

O problema que pareço estar tendo é que quando o Get-Childitem não é recursivo e -Include está presente com apenas um filtro, ele é ignorado! Ou estou fazendo algo errado (provavelmente).

Eu limpei um pouco a saída ...

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

Tããão ??? Eu tive uma fantasia onde tudo o que eu precisava fazer era ramificar para um caminho do roteiro que não tinha o interruptor recorrente. (A propósito, é possível aplicar de maneira variável parâmetros para evitar caminhos de código duplicados em que a única variabilidade é os parâmetros de um cmdlet?)

De qualquer forma, aqui está o meu script para completar, além do meu problema com o 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;
            }
        }
    }
}
Foi útil?

Solução

A resposta está na descrição completa do comando (get-help get-childitem -full):

O parâmetro incluído é efetivo apenas quando o comando inclui o parâmetro Recurse ou o caminho leva ao conteúdo de um diretório, como C: Windows *, onde o caractere curinga especifica o conteúdo do diretório C: Windows.

Portanto, o seguinte funcionaria sem recurso.

PS C:\foo> Get-childitem -path "c:\foo\*" -Include *.txt

Outras dicas

Esse é o comportamento esperado, mas reconhecidamente confuso. Do arquivo de ajuda Get-Childitem:

-Include <string[]>

Recupera apenas os itens especificados. O valor deste parâmetro qualifica o parâmetro do caminho. Digite um elemento ou padrão de caminho, como "*.txt". Os curingas são permitidos.

O parâmetro incluído é efetivo apenas quando o comando inclui o parâmetro Recurse ou o caminho leva ao conteúdo de um diretório, como C: Windows*, onde o caractere curinga especifica o conteúdo do diretório C: Windows.

PS> Ajuda Dir -full | mais

Espero que isto ajude,

-Oisin

Não posso dizer o porquê exato (mas continuarei procurando), mas o comportamento está documentado no Get-Help para 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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top