当前正在尝试查看是否有一种方法可以将特定.csv列中的条目与目录中的特定文件列表部分匹配,然后重命名匹配的条目,使其准确地表示文件。
例如,如果我有一系列文件如下:
23.54_0.DXF
24.58_0.1.DXF
25.01_0.DXF
.csv列中的条目为:
23.54 - Gusset
24.58 - shell plate
25.01 - reopad
我想将.csv条目重命名为:
23.54_0.DXF
24.58_0.1.DXF
...
我已经看到了很多相反场景的例子(基于.csv列重命名文件(,但似乎找不到一个例子来代表我在这里试图实现的目标。
以下允许我将.csv条目获取为";匹配";当版本号不变时的文件名(零件名后面的"_X"(,但它不像我让它按上面描述的那样灵活:
$rev=gci -path "$FolderPath" -Filter *.DXF | Select-Object -first 1
$RevA=$rev.ToString().Substring(5) -replace(".DXF") -replace('[a-z]') -replace('-') -replace
's',''
$BOM=gci -path "$FolderPath" -Filter *.csv | Select-Object -first 1
Import-Csv -Path "$FolderPath$BOM" | ForEach-Object {
$_.PartName = "$($_.PartName -replace('[a-z]') -replace('-') -replace 's','')$RevA.DXF"
$_.Thickness = "$($_.Thickness)" -replace("PL")
$_
} | Export-Csv -Path "$FolderPathPrimeCutImport$RevA.csv" -NoTypeInformation
Add-Type -AssemblyName PresentationFramework
[windows.forms.messagebox]::show('Updated')
有没有一种方法可以列出目录中的所有.DXF
,获取列中的所有条目(在这种情况下,列标题是"PartName"($_.PartName)
(,然后将每个条目中的前4-5个字符与文件名中共享相同前4-5个字符的相应文件匹配?
对于每个匹配项,我希望列条目按照文件名命名。不知道这是否朝着正确的方向发展:
$filedirectory="C:Directoryetcfolder"
$tester=Import-csv $filedirectoryexample.csv
$listdxf=gci $filedirectory -filter *.DXF
foreach($file in $listdxf){
foreach($item in $tester){
# Not sure how to do this to only match the first 4 characters - trying to use the substring returns an error.
if($item.name.tostring.substring(0,4) -eq
$file.basename.tostring.substring(0,4)){
rename-item $item.name -newname
"$($file.basename).$($file.extension)" -Verbose
}
}
}
上面的代码使用.csv文件进行编辑,然后重命名文件,这与我想要的相反。新手太多了,不知道该怎么做,任何想法和反馈都将不胜感激。
在Foreach-Object
之后直接管道连接到Export-Csv
的问题是,每次都会被新条目覆盖。您必须先执行操作,然后再导出。
在不考虑其他可能重复的名称的情况下,可以拆分PartName
,获取连字符(-
(之前的内容。然后,您就可以通过名称的第一部分匹配到文件名本身的下划线(_
(。
$names = Get-ChildItem -Path $FolderPath -Filter '*.DXF' -Name
(
Import-Csv -Path "$filedirectoryexample.csv" | % {
$part = ($_.PartName -split ' -')[0]
$file_match = $names.Name | Where-Object -FilterScript { $_ -match "^${part}_" }
$_.PartName = if ($file_match) { $file_match } else { $_.PartName }
$_
}
) | Export-Csv -Path "$filedirectoryexample.csv" -NoTypeInformation
顾名思义,$names
包含以*.DXF
扩展名结尾的文件名。当您将PartName
的当前迭代与文件名的开头进行比较时,匹配就是在这里发生的。