Arrays 如何使用PowerShell比较文件夹和阵列中的子字符串?

Arrays 如何使用PowerShell比较文件夹和阵列中的子字符串?,arrays,powershell,directory,sql-like,Arrays,Powershell,Directory,Sql Like,我有一个包含100000个文件(图片)的文件夹,这些文件以UPC代码(8到14个数字)命名,后跟下划线和其他数字: 000012345678_00_1 我在word文档中列出了20000个唯一的UPC代码(用逗号分隔),这些代码应该与这些图片中的五分之一相匹配(我在Excel表格中也有这个列表) 我想做的是在我的数组(20000个元素列表)和文件夹中的文件之间找到匹配项,以便从文件夹中只提取那20000张图片。 首先,我将文件名剪切到“_u”,以便只获得文件名的相关部分: $FName =

我有一个包含100000个文件(图片)的文件夹,这些文件以UPC代码(8到14个数字)命名,后跟下划线和其他数字:

000012345678_00_1 
我在word文档中列出了20000个唯一的UPC代码(用逗号分隔),这些代码应该与这些图片中的五分之一相匹配(我在Excel表格中也有这个列表)

我想做的是在我的数组(20000个元素列表)和文件夹中的文件之间找到匹配项,以便从文件夹中只提取那20000张图片。

首先,我将文件名剪切到“_u”,以便只获得文件名的相关部分:

$FName = ($File -split '_')[0] 
为了让事情变得更困难,我还需要在数组中的元素中添加通配符“*”,因为文件名开头的一些额外的“0”可能已经添加,并且不在数组中。例如,数组“05713901”中的此UPC引用此文件名“00005713901_00.png”;因此,要找到匹配项,我必须使用“like”操作符

然后,当我找到这些匹配项时,我只需使用“将项目移动到新文件夹或子文件夹”

这就是我开始编写的代码,没有任何结果:

$Directory = "C:path_to_my_folder";

$AllFiles = Get-ChildItem $Directory 

$FileNames = New-Object System.Collections.ArrayList;

foreach($File in $AllFiles)

{
    $FName = ($File -split '_')[0] 
    $FileNames.Add($FName)   
}

$Upc = Get-Content C:\path_to_my_word.docx

Compare-Object $FileNames $Upc 

您无法使用
获取内容
读取
docx
-文件,即使它读取了
比较对象,也无法工作,因为word文件是UPC代码列表,由逗号分隔(powershell中的单个
字符串
),而
$FileNames
是数组(多个对象)

将UPC代码从excel复制到记事本,这样就可以得到一个简单的文本文件,每行一个代码,类似于此示例

UPC.txt-内容:

000000000000
000000000001
000000000011
....
通过一个类似于20.000的测试循环运行100.000个文件需要很长时间。我将创建一个正则表达式模式,用于查找结尾带有下划线的任何一个代码。例:

$Directory = "C:\path_to_my_folder";
$AllFiles = Get-ChildItem $Directory 

#Generate regex that matches 00001_ or 00002_ etc. Trimming leading and trailing whitespace just to be safe.
$regex = ((Get-Content -Path "c:\UPC.txt") | ForEach-Object { "$($_.Trim())_" }) -join '|'

#Get files that match
$AllFiles | Where-Object { $_.Name -match $regex } | ForEach-Object {
    #Do something, ex. Move file.
    Move-Item -Path $_.FullName -Dest C:\Destination       
}
或者干脆

$AllFiles | Where-Object { $_.Name -match $regex } | Move-Item -Destination "C:\Destination"

您无法使用
获取内容
读取
docx
-文件,即使它读取了
比较对象,也无法工作,因为word文件是UPC代码列表,由逗号分隔(powershell中的单个
字符串
),而
$FileNames
是数组(多个对象)

将UPC代码从excel复制到记事本,这样就可以得到一个简单的文本文件,每行一个代码,类似于此示例

UPC.txt-内容:

000000000000
000000000001
000000000011
....
通过一个类似于20.000的测试循环运行100.000个文件需要很长时间。我将创建一个正则表达式模式,用于查找结尾带有下划线的任何一个代码。例:

$Directory = "C:\path_to_my_folder";
$AllFiles = Get-ChildItem $Directory 

#Generate regex that matches 00001_ or 00002_ etc. Trimming leading and trailing whitespace just to be safe.
$regex = ((Get-Content -Path "c:\UPC.txt") | ForEach-Object { "$($_.Trim())_" }) -join '|'

#Get files that match
$AllFiles | Where-Object { $_.Name -match $regex } | ForEach-Object {
    #Do something, ex. Move file.
    Move-Item -Path $_.FullName -Dest C:\Destination       
}
或者干脆

$AllFiles | Where-Object { $_.Name -match $regex } | Move-Item -Destination "C:\Destination"

将UPC代码另存为纯文本文件。正如Frode F.所建议的,将它们从Excel复制到记事本可能是最简单的方法。保存该列表。然后我们将该列表加载到PowerShell中,对于每个文件,我们将像您一样在下划线处拆分,并修剪任何前导零,然后检查它是否在已知代码列表中。使用
Move Item

#Import Known UPC List
$UPCList = Get-Content C:\Path\To\UPCList.txt
#Remove Leading Zeros From List
$UPCList = $UPCList | ForEach{$_.TrimStart('0')}

$Directory = "C:path_to_my_folder"

Get-ChildItem $Directory | Where{$_.Name.Split('_')[0].TrimStart('0') -in $UPCList} | Move-Item -Dest C:\Destination

将UPC代码另存为纯文本文件。正如Frode F.所建议的,将它们从Excel复制到记事本可能是最简单的方法。保存该列表。然后我们将该列表加载到PowerShell中,对于每个文件,我们将像您一样在下划线处拆分,并修剪任何前导零,然后检查它是否在已知代码列表中。使用
Move Item

#Import Known UPC List
$UPCList = Get-Content C:\Path\To\UPCList.txt
#Remove Leading Zeros From List
$UPCList = $UPCList | ForEach{$_.TrimStart('0')}

$Directory = "C:path_to_my_folder"

Get-ChildItem $Directory | Where{$_.Name.Split('_')[0].TrimStart('0') -in $UPCList} | Move-Item -Dest C:\Destination

Compare Object
只会告诉您这两个数组是否完全匹配(它们不匹配,大小不同),或者哪些条目不符合您的期望。感谢您的澄清!我现在理解的另一个命令:)
Compare Object
只会告诉您这两个数组是否完全匹配(它们不会匹配,大小不同),或者哪些条目不符合您的期望。感谢您的澄清!还有一个命令,我现在明白了:)随你的便。对于20k行,我会选择一个文件来保持脚本的干净和动态,但这只是我的问题。:-)记住接受你最终想要的答案。谢谢你的回答!我用Excel中复制粘贴的UPC代码创建了记事本文档,但后来决定将20000个条目(带逗号)作为数组直接复制粘贴到powershell中!您是否介意展示一个示例或快速解释移动文件cmd?当我使用它时,它将我的父文件夹直接移动到C:/user!哈哈,是的,我意识到在powershell中有一个82页长的word文档并不能帮助我保持一个干净的脚本!但我不知道如何组织内容,将其从.txt转换为数组,直到您告诉我:)更新了两个示例。请随意操作。对于20k行,我会选择一个文件来保持脚本的干净和动态,但这只是我的问题。:-)记住接受你最终想要的答案。谢谢你的回答!我用Excel中复制粘贴的UPC代码创建了记事本文档,但后来决定将20000个条目(带逗号)作为数组直接复制粘贴到powershell中!您是否介意展示一个示例或快速解释移动文件cmd?当我使用它时,它将我的父文件夹直接移动到C:/user!哈哈,是的,我意识到在powershell中有一个82页长的word文档并不能帮助我保持一个干净的脚本!但我不知道如何组织内容以将其从.txt转换为数组,直到您告诉我:)更新了两个示例。您打算如何处理“000000000”?很高兴向他展示这两种解决方案。我还没有测试过它,但我认为正则表达式将比运行20k个模式快得多,运行100k次在你们两个建议之后,我使用了您给我的脚本,但是在流水线之后移动项遇到了一个错误:移动项(从法语翻译什么PS输出:)PS抱怨该条目不能链接到任何命令PAR。