2009-09-02 2 views
3

Я написал сценарий, который будет использоваться для архивирования файлов журналов с сервера. Я в очень хорошем состоянии со всем, кроме рекурсивности или нет Get-ChildItem ...PowerShell Scripting - 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 ??? У меня была фантазия, где все, что мне нужно было сделать, - это перейти к сценарию, в котором не было переключателя recurse. (Кстати, можно ли менять параметры с переменным, чтобы избежать дублирования кодов, где единственной изменчивостью являются параметры для командлета?)

В любом случае, вот мой сценарий для полноты, в дополнение к моей проблеме с 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

Я только что видел это после размещения, нажав на моем Get-ChildItem теге. Подобно OP, фильтр является специфичным для провайдера, и я уже использую его для чего-то другого. Наверное, я просто продолжаю этот вопрос. http://stackoverflow.com/questions/790796/confused-with-include-parameter-of-the-get-childitem-cmdlet –

+0

Ну, это документированное поведение, и мне нужно было RTFM. Клянусь, я сделал помощь, но я замалчивал это.Всем спасибо! –

ответ

9

Ответ на этот вопрос в полном описании команды (Get-Help Get-ChildItem -full):

в поле Включить параметр является эффективным только тогда, когда команда включает параметр Recurse или путь ведет к содержание каталога, например 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-Help для 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 | более

Надеются, что это помогает,

-Oisin

 Смежные вопросы

  • Нет связанных вопросов^_^