我希望能够对与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
}
}
答案 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