我已经达到了我目前知识的上限。我需要导入一个 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 |
如果“-”之前的值始终是数字,那么您可以使用正则表达式,
$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
}
}
}