在多个文件夹中递归搜索txt文件中的每个项目

时间:2018-11-22 12:35:15

标签: powershell

我希望能够对与txt文件中的文件不匹配的每个子文件夹进行优化搜索。

txt文件示例:

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等)。而且该文件夹还包含和我的txt文件中未包含的其他文件。我想将此txt文件与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

,仅复制那些不包含在txt文件中的文件。

我的方法:

[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 :(得分:1)

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   

这是我的ramdrive a上的这棵树:

> 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