2015-04-17 5 views
0

У меня есть этот Powershell код:Powershell хватает дополнительные файлы

Function CheckFileList() 
{ 
    $limit = (Get-Date).AddDays(-270) 
    $input_path = gci '//blah/folder/' | sort -property LastWriteTime 
    $output_file = 'c:\PowershellScripts\prune_results.txt' 
    #Clear-Content $output_file 
    $countf = 0 
    $outputstr = "" 

    $outputstr = $(Get-Date -format 'F') + " - Folders to be purged:`r`n" 

    $input_path | Foreach-Object{ 
     if ((Get-Item $_.FullName) -is [System.IO.DirectoryInfo]) { 
      if ($_.LastWriteTime -le $limit) { 
       $source=$input_path + $_.Name 
       $dest="\\server\otherfolder" + $_.Name 
       [email protected]("/MOVE") 
       [email protected]("/COPY:DAT /DCOPY:T") 
       $cmdArgs = @("$source","$dest",$what,$options) 
       "robocopy " + $cmdArgs >> $output_file 
       #robocopy @cmdArgs 
       #Move-Item $_.FullName \\server\otherfolder 
       $outputstr = $outputstr + " (" + $_.LastWriteTime + ") `t" + $_.Name + "`r`n" 
       $countf++ 
       $outputstr = $outputstr + "Folders [to be] purged: " + $countf + "`r`n`r`n" 
       $outputstr >> $output_file 
       Exit 
      } 
     } 
    } 

    #$outputstr = $outputstr + "Folders [to be] purged: " + $countf + "`r`n`r`n" 
    #$outputstr >> $output_file 

} 

CheckFilelist 

Этот код только для отображения, как команда будет работать. Это всего лишь 1 цикл (выход после первого цикла), поэтому он должен был захватить 1 папку.

Но результат был гигантским и, казалось, включал в себя все папки (1000+) вместо одного. Это было примерно так:

robocopy file1.txt FOLDER1 FOLDER2 FOLDER3 FOLDER4 ........ \\server\otherfolder\FOLDER5 

Я что-то пропустил? Следует перемещение папок на //blah/folder/ в другую сетевую папку (\\server\otherfolder)

+1

Эта строка '$ источника = $ input_path + $ _. Name' ваш' $ source' будет содержать несколько файлов я думаю, так как входной путь идет от 'Get-ChildItem'? – Matt

+0

Какую папку он должен захватить? Тот, который был написан последним? Есть несколько вопросов, здесь я вижу, что я не уверен, что это за намерение – Matt

+0

@Matt Обновил мой вопрос с того, какие папки – Zeno

ответ

1

Ядро вашего вопроса исходит из того, как вы заселение $source

$source=$input_path + $_.Name 

Что происходит потому, как вы определяете $input_path

$input_path = gci '//blah/folder/' | sort -property LastWriteTime 

Вы идете по всему предмету, пока ищете только один. Есть и другие способы достичь такого же вывода. $input_path это не путь, а сборник папок и файлов в «// бла/папки»

$input_path = gci 'c:\temp' | Where-Object{($_.LastWriteTime -le $limit) -and ($_.PSIsContainer)} 
$input_path | ForEach-Object{ 
    #... do things 
    $_.FullName 
    # Fullname is the complete path. 
} 

О Robocopy

Я думаю, что большая часть этой логики может быть излишним, если вы посмотрите на /MINAGE в документации ROBOCOPY

/MINAGE: п Исключает файлы с дата последнего изменения новее, чем п дней или указанной даты. Если n меньше 1900, то n выражается в днях. В противном случае n - это дата, обозначенная как YYYYMMDD.

Хотя после прочтения вы комментируете и снова спрашиваете, это скорее всего не то, что вы ищете.

О Move-Item

Я вижу, что вы пытаетесь, что хорошо. Это должно отлично работать с использованием нашего нового $input_path, подключенного к сети Move-Item. Если вам нужна регистрация, вы можете использовать ForEach-Object, чтобы разрешить регистрацию дополнительной информации в другом месте.

$input_path | Move-Item -Destination "\\server\otherfolder" 
+0

Правильно, я вижу это сейчас, поэтому источник действительно должен быть '// blah/folder/+ $ _. Name' или sort – Zeno

+0

Еще лучше использовать' $ _. FullName', который содержит полный путь. – Matt

+0

В качестве альтернативы, чтобы проверить папку, вы также можете использовать '' 'Test-Path $ _. FullName -PathType Container''', чтобы увидеть, является ли это папкой или использовать' '' Leaf''' вместо контейнера для проверки для файла. – squid808

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