2009-09-02 6 views
3

サーバーからログファイルをアーカイブするためのスクリプトを作成しました。私はすべてのものでかなり良い形をしていますが、再帰性はありません。Get-ChildItem ...PowerShell Scripting - Get-ChildItem

Get-ChildItemが再帰的でなく、1つのフィルタでのみ存在すると、問題が発生しているようです。無視されました!または、私は間違ったことをしています(おそらく)。

私は少し出力をクリーンアップしました

...

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 

すっごく

???私は、再帰スイッチを持たないスクリプトのパスに分岐しなければならないという幻想を持っていました。 (ちなみに、変数の唯一の可変性がコマンドレットのパラメータである場合、コードパスが重複しないようにパラメータを可変に適用することは可能ですか?)

とにかく、ここでは完全性のためのスクリプトです。 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; 
      } 
     } 
    } 
} 
+0

-Oisin私はちょうど私のGet-ChildItemコマンドレットのタグをクリックして投稿した後、これを見ました。 OPのように、フィルタはプロバイダ固有で、私はすでに他のもののために使っています。私はこの質問の続きだと思う。 http://stackoverflow.com/questions/790796/confused-with-include-parameter-of-the-get-childitem-cmdlet –

+0

これは文書化された動作であり、私はRTFMする必要がありました。私は助けをしたことを誓いますが、私はそれを見ています。みんな、ありがとう! –

答えて

9

答え(取得-ChildItemコマンドレット-full-助けを得る)コマンドの完全な説明である:

含めるパラメータは、コマンドが 再帰パラメータを含んでいるか、パスがにつながるときにのみ有効であり ディレクトリの内容(例: C:\ Windows \ *)。ここで、ワイルドカード は、 というC:\ Windowsディレクトリの内容を指定します。

したがって、以下は繰り返しなくても動作します。

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

私は馬鹿のように感じる!ご協力いただきありがとうございます。 –

+4

Nah。このコマンドをあまりにも厄介なものにするためにMSを責める。 – hythlodayr

+0

基本的には、PathとRecurseによってオブジェクトの初期リストが決定され、その後、IncludeとExcludeによってフィルタリングされます。だから "C:\ foo"はあなたに一つのディレクトリ情報オブジェクトを与えます。 "C:\ foo \ *"は "foo"のすべての内容を返します。 – JasonMArcher

1

私はあなたに正確に伝えることができませんなぜそれ(私は探し続けるだろう)が、動作がためには、Get-ヘルプに記載されているの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. 
2

これは予想される動作ですが、明らかに混乱します。 Get-ChildItemヘルプファイルから:

-Include <string[]> 

指定された項目のみを取得します。このパラメータの値は、Pathパラメータを修飾します。 「* .txt」などのパス要素またはパターンを入力します。ワイルドカードは許可されます。

Includeパラメーターは、コマンドにRecurseパラメーターが含まれているか、C:\ Windows *などのディレクトリの内容にパスが含まれている場合にのみ有効です。ワイルドカード文字はC:\ Windowsディレクトリの内容を指定します。 。

ps> help dir -full |より

・ホープ、このことができます、