Рекурсивно искать каждый элемент в текстовом файле в нескольких папках - PullRequest
0 голосов
/ 22 ноября 2018

Я хочу иметь возможность выполнять оптимизированный поиск по каждой подпапке, которая не соответствует моим файлам в моем текстовом файле.

Пример текстового файла:

1.2.0.0_009           
1.2.0.0_008           
1.2.0.0_007           
1.2.0.0_006           
1.2.0.0_005           
1.2.0.0_004           
1.2.0.0_003           
1.2.0.0_002           
1.2.0.0_001           
1.1.0.0_106           
1.1.0.0_105           
1.1.0.0_104           
1.1.0.0_103           
1.1.0.0_102           
1.1.0.0_101           
1.1.0.0_100           
1.0.0.0_089           
1.1.0.0_099                    
1.0.0.0_088           
1.0.0.0_087           
1.0.0.0_086           
1.0.0.0_085           
1.0.0.0_084           
1.0.0.0_083           
1.0.0.0_082           
1.0.0.0_081           
1.0.0.0_080           
1.0.0.0_079           
1.0.0.0_078           
1.0.0.0_077           
1.0.0.0_076           
1.0.0.0_075           
1.0.0.0_074           
1.0.0.0_073           
1.0.0.0_072           
1.0.0.0_071           
1.0.0.0_070           
1.0.0.0_069           
1.0.0.0_068           
1.0.0.0_067           
1.0.0.0_066           
1.0.0.0_065           
1.0.0.0_064           
1.0.0.0_063           
1.0.0.0_062           
1.0.0.0_061           
1.0.0.0_060                    
1.0.0.0_052           
1.0.0.0_051           
1.0.0.0_050           
1.0.0.0_049           
1.0.0.0_048           
1.0.0.0_047           
1.0.0.0_046           
1.0.0.0_045           
1.0.0.0_044           
1.0.0.0_043           
1.0.0.0_042           
1.0.0.0_041           
1.0.0.0_040           
1.0.0.0_039           
1.0.0.0_038           
1.0.0.0_037           
1.0.0.0_036_1         
1.0.0.0_036              
0.0.0.1_89            
0.0.0.1_88            
0.0.0.1_87            
0.0.0.1_86            
0.0.0.1_85_1          
0.0.0.1_85            
0.0.0.1_84            
0.0.0.1_83            
0.0.0.1_82            
0.0.0.1_81            
0.0.0.1_80_1          
0.0.0.1_80            
0.0.0.1_79_1          
0.0.0.1_79            
0.0.0.1_78            
0.0.0.1_77            
0.0.0.1_76            
0.0.0.1_75            
0.0.0.1_74            
0.0.0.1_73            
0.0.0.1_72            
0.0.0.1_71            
0.0.0.1_70            
0.0.0.1_69            
0.0.0.1_68            
0.0.0.1_67            
0.0.0.1_66            
0.0.0.1_65            
0.0.0.1_64            
0.0.0.1_63            
0.0.0.1_62            
0.0.0.1_61            
0.0.0.1_60            
0.0.0.1_59            
0.0.0.1_58            
0.0.0.1_57            
0.0.0.1_56            
0.0.0.1_55            
0.0.0.1_54            
0.0.0.1_53            
0.0.0.1_52_1          
0.0.0.1_52            
0.0.0.1_51            
0.0.0.1_50            
0.0.0.1_49            
0.0.0.1_48            
0.0.0.1_47_1          
0.0.0.1_47            
0.0.0.1_46            
0.0.0.1_45            
0.0.0.1_44_1          
0.0.0.1_44            
0.0.0.1_43_1          
0.0.0.1_43            
0.0.0.1_42            
0.0.0.1_41            
0.0.0.1_40            
0.0.0.1_39            
0.0.0.1_38            
0.0.0.1_37            
0.0.0.1_36            
0.0.0.1_35            
0.0.0.1_34            
0.0.0.1_33            
0.0.0.1_32            
0.0.0.1_31_1          
0.0.0.1_31            
0.0.0.1_30            
0.0.0.1_29            
0.0.0.1_28            
0.0.0.1_27            
0.0.0.1_26            
0.0.0.1_25            
0.0.0.1_24            
0.0.0.1_23            
0.0.0.1_22            
0.0.0.1_21            
0.0.0.1_20            
0.0.0.1_19            
0.0.0.1_18            
0.0.0.1_17            
0.0.0.1_168           
0.0.0.1_167           
0.0.0.1_166           
0.0.0.1_165           
0.0.0.1_164           
0.0.0.1_163           
0.0.0.1_162           
0.0.0.1_161   

Теперь первые цифры представляютпапка (например, 1.2.0.0 - папка), которая содержит файлы (009,008 и т. д.).Но также эта папка содержит и другие файлы, которые не содержатся в моем текстовом файле .Я хочу сравнить этот текстовый файл с каждой папкой в ​​моем MainFolder:

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       11/22/2018   1:04 PM                0.0.0.1
d-----       11/22/2018   1:04 PM                1.0.0.0
d-----       11/22/2018   1:04 PM                1.1.0.0
d-----       11/22/2018   1:04 PM                1.2.0.0
-a----       11/13/2018  11:54 AM          70656 DbUp.dll
-a----       11/13/2018  11:54 AM         230912 DbUp.pdb

и скопировать только те, которые не содержатся в текстовом файле.

Мой подход:

[string]$SourceTxtDbFile = "C:\file.txt"
$delimitedFile = Get-Content $SourceTxtDbFile | ConvertFrom-String -Delimiter "_" -PropertyNames DbVersion, ScriptNumber

#foreach file in $delimitedFile
foreach ($file in $file_list){
# foreach file in the folders
foreach($dir in (Get-ChildItem $source -Recurse)){
    # if the file name is in diretocry listed
    if($file -eq $dir.name){
        # copy only once, if the document name already exists, skip
        if(-not(test-path "$destination\$file")){
            # copy the file
            Copy-Item $dir.fullname -Destination $destination -Verbose
        }
     }
   }
}

Но я предполагаю, что это может быть более оптимизированный код.

ОБНОВЛЕНИЕ: любезно предоставлено @LotPings Вот рабочий код (отредактированный мной):

 $uatScripts = (Get-Content $uatFile).Trim() # there were trailing spaces

Push-Location $source

Get-ChildItem *\* -File | ForEach-Object {
    $LookUp = "{0}" -f $_.BaseName
    If ($uatScripts -notcontains $LookUp) {
        Copy-Item $_.FullName -Destination $destination
    }
}

1 Ответ

0 голосов
/ 22 ноября 2018

IMO, ваш скрипт использует неправильный подход,

  • Я бы сохранил содержимое $SourceTxtDbFile как есть и
  • построил бы соответствующие записи из каталога и имени файла
    (где неясно, имеют ли файлы расширение)

РЕДАКТИРОВАТЬ: С этим закороченным file.txt

0.0.0.1_86            
0.0.0.1_85_1          
0.0.0.1_85            
0.0.0.1_163           
0.0.0.1_162           
0.0.0.1_161   

и это дерево на моем ramdrivea:

> tree a:\ /f
Auflistung der Ordnerpfade für Volume RamDisk
Volumeseriennummer : 5566-7788
A:\
│   file.txt
│
└───0.0.0.1
        161
        162
        163
        164
        165
        82
        83
        84
        85
        85_1

Этот слегка измененный скрипт

## Q:\Test\2018\11\22\SO_53431173.ps1

$source = "A:\"
Push-Location $Source
$destination = "C:\Test"
$SourceTxtDbFile = ".\file.txt"

$DbVScript = (Get-Content $SourceTxtDbFile).Trim() # there were trailing spaces

Get-ChildItem *\* -File | ForEach-Object{
  $LookUp = "{0}_{1}" -f $_.Directory.Name,$_.Name
  If ($DbVScript -notcontains $LookUp){
      Copy-Item $_.FullName -Destination $destination -Verbose -WhatIf
  } else {
      "File {0} is in `$DbVScript: {1}" -f $_.FullName,$LookUp
  }
}

Возвращает следующий вывод.(Если вывод выглядит нормально, удалите трейлинг -WhatIf)

> Q:\Test\2018\11\22\SO_53431173.ps1
File A:\0.0.0.1\161 is in $DbVScript: 0.0.0.1_161
File A:\0.0.0.1\162 is in $DbVScript: 0.0.0.1_162
File A:\0.0.0.1\163 is in $DbVScript: 0.0.0.1_163
WhatIf: Ausführen des Vorgangs "Datei kopieren" für das Ziel "Element: A:\0.0.0.1\164 Ziel: C:\Test\164".
WhatIf: Ausführen des Vorgangs "Datei kopieren" für das Ziel "Element: A:\0.0.0.1\165 Ziel: C:\Test\165".
WhatIf: Ausführen des Vorgangs "Datei kopieren" für das Ziel "Element: A:\0.0.0.1\82 Ziel: C:\Test\82".
WhatIf: Ausführen des Vorgangs "Datei kopieren" für das Ziel "Element: A:\0.0.0.1\83 Ziel: C:\Test\83".
WhatIf: Ausführen des Vorgangs "Datei kopieren" für das Ziel "Element: A:\0.0.0.1\84 Ziel: C:\Test\84".
File A:\0.0.0.1\85 is in $DbVScript: 0.0.0.1_85
File A:\0.0.0.1\85_1 is in $DbVScript: 0.0.0.1_85_1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...