通过循环遍历 .txt / .csv 文件中的名称列表以进行部分匹配,重命名目录中的多个文件
Rename multiple files in a directory by looping through a list of names in a .txt / .csv file for a partial match
我正在尝试自动重命名 Windows 7 目录中的多个文件。我需要搜索源索引文件(.txt 或 .csv,这是一个扩展文件名列表),并且在与原始文件名部分匹配的地方,复制前 12 个字符(索引中相关字符串的文件)并相应地重命名原始文件(并保留原始文件扩展名)。
例如
(a) 当前在Windows目录下的文件命名如下(数百个文件):
- 23456abc.doc
- 76543cab.doc
- 92837bca.doc
(b) .txt/.csv 文件中的值如下(数百个值 - 注意:这些没有文件扩展名):
- BetterName1.RandomText1.23456abc.MoreRandomText1
- BetterName2.RandomText2.76543cab.MoreRandomText2
- BetterName3.RandomText3.92837bca.MoreRandomText3
(c) Desired Result is for the files to be auto renamed as follows:
[通过在 (a) 中的值列表中搜索 (a) 中的文件名,如果匹配,返回前 12 个字符作为新文件名,同时保留原始文件扩展名]
- BetterName1.doc
- BetterName2.doc
- BetterName3.doc
注意:我的偏好是使用 .txt 格式的索引文件进行查找。但是有需要我也可以使用 .csv
我以前从未使用过 PowerShell,并且是 Windows 批处理脚本的新手。我四处搜索并试图将代码片段拼凑成一个 Windows 批处理脚本(也尝试了一个 PowerShell 脚本)来实现这一点,但我在这方面的知识严重缺乏所以不幸的是我仍在努力一.
如有任何帮助,我们将不胜感激。提前谢谢你。
P.S。这是我尝试运行但无济于事的 PowerShell 脚本。
$fdPath = 'C:\TEST\Data'
$sourcelistFiles = Get-ChildItem -Path $FDPATH\*.txt | ForEach-Object {$_.user } FullName
$findReplaceList = Import-Csv -Path $FDPATH\AllNames.csv
$totalitems = $sourcelistFiles.count
$currentrow = 0
foreach ($sourcelistFile in $sourcelistFiles)
{
$currentrow += 1
Write-Progress -Activity "Processing record $currentrow of $totalitems" -Status "Progress:" -PercentComplete (($currentrow / $totalitems) * 100)
[string] $txtSourceListFile = Get-Content $sourcelistFile | Out-String
ForEach ($findReplaceItem in $findReplaceList)
{
$txtSourceListFile = $txtSourceListFile -replace "$($findReplaceitem.FindString)", "$($findReplaceitem.ReplaceString)"
}
$txtSourceListFile | Set-Content ($sourcelistFile)
-NoNewLine
}
$FDPATH = 'C:\TEST\Data'
foreach($obj in (Import-Csv -Path $FDPATH\AllNames.csv)){
foreach($thing in $(gci -Path $FDPATH\*.txt)){
if("123.hash.avocado" -match $thing.basename){$ret = $thing.fullname}
}
$stuff = $obj -split "."
ren -Path $ret -NewName $stuff[0]
}
看看这是否可行,它遍历 csv 然后遍历目录以查看目录的名称是否在正在迭代的 csv 行中,然后将变量设置为文件的全名并重命名它句号前的名字。
Import-CSV LISTA.csv -Header 新文件名 | % { Copy-Item -Path archivo_convert.pdf -Destination "$($_.newfilename).pdf" }
我正在尝试自动重命名 Windows 7 目录中的多个文件。我需要搜索源索引文件(.txt 或 .csv,这是一个扩展文件名列表),并且在与原始文件名部分匹配的地方,复制前 12 个字符(索引中相关字符串的文件)并相应地重命名原始文件(并保留原始文件扩展名)。
例如
(a) 当前在Windows目录下的文件命名如下(数百个文件):
- 23456abc.doc
- 76543cab.doc
- 92837bca.doc
(b) .txt/.csv 文件中的值如下(数百个值 - 注意:这些没有文件扩展名):
- BetterName1.RandomText1.23456abc.MoreRandomText1
- BetterName2.RandomText2.76543cab.MoreRandomText2
- BetterName3.RandomText3.92837bca.MoreRandomText3
(c) Desired Result is for the files to be auto renamed as follows:
[通过在 (a) 中的值列表中搜索 (a) 中的文件名,如果匹配,返回前 12 个字符作为新文件名,同时保留原始文件扩展名]
- BetterName1.doc
- BetterName2.doc
- BetterName3.doc
注意:我的偏好是使用 .txt 格式的索引文件进行查找。但是有需要我也可以使用 .csv
我以前从未使用过 PowerShell,并且是 Windows 批处理脚本的新手。我四处搜索并试图将代码片段拼凑成一个 Windows 批处理脚本(也尝试了一个 PowerShell 脚本)来实现这一点,但我在这方面的知识严重缺乏所以不幸的是我仍在努力一.
如有任何帮助,我们将不胜感激。提前谢谢你。
P.S。这是我尝试运行但无济于事的 PowerShell 脚本。
$fdPath = 'C:\TEST\Data'
$sourcelistFiles = Get-ChildItem -Path $FDPATH\*.txt | ForEach-Object {$_.user } FullName
$findReplaceList = Import-Csv -Path $FDPATH\AllNames.csv
$totalitems = $sourcelistFiles.count
$currentrow = 0
foreach ($sourcelistFile in $sourcelistFiles)
{
$currentrow += 1
Write-Progress -Activity "Processing record $currentrow of $totalitems" -Status "Progress:" -PercentComplete (($currentrow / $totalitems) * 100)
[string] $txtSourceListFile = Get-Content $sourcelistFile | Out-String
ForEach ($findReplaceItem in $findReplaceList)
{
$txtSourceListFile = $txtSourceListFile -replace "$($findReplaceitem.FindString)", "$($findReplaceitem.ReplaceString)"
}
$txtSourceListFile | Set-Content ($sourcelistFile)
-NoNewLine
}
$FDPATH = 'C:\TEST\Data'
foreach($obj in (Import-Csv -Path $FDPATH\AllNames.csv)){
foreach($thing in $(gci -Path $FDPATH\*.txt)){
if("123.hash.avocado" -match $thing.basename){$ret = $thing.fullname}
}
$stuff = $obj -split "."
ren -Path $ret -NewName $stuff[0]
}
看看这是否可行,它遍历 csv 然后遍历目录以查看目录的名称是否在正在迭代的 csv 行中,然后将变量设置为文件的全名并重命名它句号前的名字。
Import-CSV LISTA.csv -Header 新文件名 | % { Copy-Item -Path archivo_convert.pdf -Destination "$($_.newfilename).pdf" }