список файлов, которые содержат строку из файла и дата изменения - последние 7 дней - PullRequest
0 голосов
/ 11 мая 2018

У меня есть папка, содержащая кучу файлов с изображениями, и формат имен похож на:

kitty_BW.jpg
puppy_B_W.jpg
ball_BlWh.jpg
rope_bw.jpg
shoe_Bw.jpg
kitty_C.jpg
puppy_Color.jpg
ball_c.jpg
rope_color.jpg
shoe_col.jpg

чтобы переместить нужные мне файлы я создал список

kitty
puppy
ball
rope
shoe

так что мне нужно переместить файлы, которые НЕ в списке файлов TXT И старше этого месяца ,

Я начинал с этим кодом

$file_list = Get-Content C:\photoList.txt
$search_folder = "D:\photos"
$destination_folder = "C:\Backup"

foreach ($file in $file_list) {
    $file_to_move = Get-ChildItem -Path $search_folder -Filter $file -Recurse -ErrorAction SilentlyContinue -Force | % { $_.FullName}
    if ($file_to_move) {
        Move-Item $file_to_move $destination_folder
    }
}

но это работает, только если полное имя файла находится в списке, а перемещаемый файл включен в список, но я хочу переместить файлы, которых нет в списке и которые старше этого месяца, поэтому я могу избавиться от них.

EDIT

Я пробовал все виды вещей, но по какой-то причине это не сравнивается

$file_list =  "C:\FAphotoList.txt"
$search_folder ="C:\FAphotos"
$destination_folder = "C:\Backup\"

$first_day = $(Get-Date -UFormat "%Y / %m ") + "/ 01"
$list = (Get-ChildItem $search_folder | ? LastWriteTime -lt $first_day).name

echo $list | Select-String -Pattern  '0183444'

 Get-Content $file_list | % {
    $list2 = ($list | Select-String -Pattern $_)
    }
echo list2
echo $list2

#here is my problem
$list2 | % {
[array]::indexof($list,$_)
}

echo "final list"
echo  $list

проблема в том, что когда я пытаюсь сравнить список с [array]::indexof($list, "kitty_BW.jpg") это работает, но когда я пробую это как в примере, я ничего не получаю.

РЕДАКТИРОВАТЬ 2

$file_list =  "C:\FAphotoList.txt"
$search_folder ="C:\FAphotos"
$destination_folder = "C:\Backup\"

$first_day = $(Get-Date -UFormat "%Y / %m ") + "/ 01"
$list = (Get-ChildItem $search_folder | ? LastWriteTime -lt $first_day).name

echo lista
Get-Content $file_list | % {
    $list.Remove(($list | Select-String -Pattern $_))
    }
$list | % {
    Move-Item $file_to_move $destination_folder
    }

echo "final list"
$list = (Get-ChildItem $search_folder | ? LastWriteTime -lt $first_day).name
echo  $list

получает мне эту ошибку

Exception calling "Remove" with "1" argument(s): "Collection was of a fixed size."
At C:\FAphotos.ps1:17 char:5
+     $list += $list.Remove(($list | Select-String -Pattern $_))
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : NotSupportedException

поэтому я пытался привести к списку массивов, но это не сработало, поэтому я пробовал много разных вещей.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Немного покопавшись и спросив, я наконец-то заставил его работать.

$baseWorkFolder = 'C:';
$searchFolder = Join-Path $baseWorkFolder "FAphotos";
$destFolder = Join-Path $baseWorkFolder "Backup";
$LastYear = '1/1/' + $(Get-Date -UFormat "%Y"); 
Write-Host "LastYear: $LastYear";

[string[]] $fileList =  Get-Content "$($baseWorkFolder)\FAphotoList.txt"; 
Write-Host "FileList:`n`t$fileList" -foregroundcolor Green;

[string[]] $FilesInSearchFolder = Get-ChildItem $searchFolder -name;
Write-Host "FilesInfolder:`n`t$FilesInSearchFolder" -foregroundcolor Green;


$moveList = New-Object System.Collections.Generic.HashSet[String]
foreach ($file in $FilesInSearchFolder ){
    $moveList.add($file)
}


Write-Host "FilesInfolder:`n`t$moveList" -foregroundcolor Green;

foreach ( $fileName in $FilesInSearchFolder ) {
    foreach ( $empID in $fileList ) {
        Write-Host "`n`tComparing Strings $fileName - $empID = $($fileName.IndexOf($empID))";
            if ($fileName.IndexOf($empID) -ge 0) {
                 $moveList.remove($fileName);
            }
    }
}

Write-Host "Potential Remove List:`n`t$moveList" -foregroundcolor Red;

foreach ( $removeItem in $moveList ) {
    $removegcItem = Get-ChildItem -Path $(Join-Path $searchFolder $removeItem);
    Write-Host "`n`tProcessing $($removegcItem.FullName)";
    Write-Host "`tChecking if file is older than $LastYear" -foregroundcolor Green;

    if ($removegcItem.LastWriteTime -lt $LastYear) {
        Write-Host "`tMoving $removegcItem to $destFolder";
        Move-Item "$($removegcItem.FullName)" "$(Join-Path $destFolder $($removegcItem.Name))" ;
    }
}

Write-Host "Final list (Newer than $LastYear):";
Write-Host "`t$( ( Get-ChildItem $searchFolder | Where-Object { $_.LastWriteTime -lt $LastYear } ).name )" `
    -Foregroundcolor Yellow -BackgroundColor Black;

пришлось использовать хэш-набор и другой массив, потому что я получил ошибку, не являющуюся объектом с изменяемым размером.

Мне кажется, я не смог сравнить, потому что сравнивал строки с путями.

0 голосов
/ 11 мая 2018

У вас 2,5 основных задания:

  1. Определите файлы, которые старше this month, эта задача включает в себя половину задачи: как вы получаете первый день этого месяца?
  2. Сравните, какое имя файла НЕ в файле .txt.

    $first_day = $(Get-Date -Format "yyyy/mm") + "/01"
    $list = (Get-ChildItem | ? LastWriteTime -lt $first_day).Name
    
    Get-Content C:\photolist.txt | % {
        $list.Remove(($list | Select-String -Pattern $_))
        }
    $list | % {
        Move-Item $file_to_move $destination_folder
        }
    

Не проверено, пожалуйста, попробуйте, и дайте нам знать результат. Удачи! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...