如何导入 CSV,读取列的部分单元格数据直至特定字符集,然后搜索文件夹以查找匹配的名称并重命名它们

问题描述 投票:0回答:1

我已经达到了我目前知识的上限。我需要导入一个 CSV 文件,读取两列,匹配第 3 列中的部分单元格数据,在特定文件夹深度(向下四层)的文件服务器中搜索名称与第 3 列中的部分单元格数据部分匹配的任何子文件夹,以及然后使用第 1 列中的部分单元格数据重命名该文件夹。

我当前的脚本如下所示。只要我知道数据的长度是 10 个字符,它就很好用。当数据为 9 个字符或有空格时,它会中断,在这种情况下,它不会进行匹配,并会根据与硬编码的 10 个字符不匹配的值跳过重命名文件夹。

由于第 3 列中的数据具有类似的命名约定,所以我更愿意做的是读取第 3 列中的单元格数据,直到“-”(空格、连字符、空格),然后它可以根据之前的内容重命名文件夹该组字符而不是尝试始终匹配 X 个字符。

csv 数据的示例如下所示:

第1栏 第2栏 第3栏
0123-000001 1234567890 - 一些附加文本
0234-000002 123456789 - 一些附加文本
0567-000003 12345 678 - 一些附加文本

当前脚本:

$folderPath = "\\server\share\*\*\*\*"
$csvPath = "C:\pathtolocalfile\localfile.csv"

$csvData = Import-Csv -Path $csvPath

foreach ($row in $csvData)
{
    $partialCellData = $row.Column3.Substring(0, 10)
    $prepend = $row.Column1.Substring(5, 6)
    $subfolders = Get-ChildItem -Path $folderPath -Directory

    foreach ($subfolder in $subfolders)
    {
        if ($subfolder.Name -like "*$partialCellData*")
        {
            $newName = "("+ $prepend + ") " + $subfolder.Name
            Rename-Item -Path $subfolder.FullName -NewName $newName
        }
    }
}

文件服务器上的最终结果将如下所示:

文件夹
02382_1234567890_3932
123456789_6878
我_喜欢_PIE_12345 678_5200

更名为

文件夹
(000001) 02382_1234567890_3932
(000002)123456789_6878
(000003)我_喜欢_PIE_12345 678_5200
powershell csv directory
1个回答
0
投票

如果“-”之前的值始终是数字,那么您可以使用正则表达式,

$folderPath = "\\server\share\*\*\*\*"
$csvPath = "C:\pathtolocalfile\localfile.csv"

$csvData = Import-Csv -Path $csvPath

foreach ($row in $csvData) {
    $partialCellData = [regex]::Match($row.Column3, "\d+\s\d+|\d+").Groups[0].Value
    $prepend = [regex]::Match($row.Column1, "(\d{4})-(\d{6})").Groups[2].Value
    $subfolders = Get-ChildItem -Path $folderPath -Directory

    foreach ($subfolder in $subfolders) {
        if ($subfolder.Name -match $partialCellData)
        {
            $newName = "("+ $prepend + ") " + $subfolder.Name
            Rename-Item -Path $subfolder.FullName -NewName $newName
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.