从csv列表重命名文件,执行太多循环

时间:2017-08-09 04:45:02

标签: powershell csv foreach

作为PowerShell的初学者,我构建了这个代码,将每个pdf放在一个文件夹中,并根据位于csv中的名称重命名。

下面的代码确实有效,但循环过多会导致以下多个错误:

  

在该文件已存在时无法创建文件

$folderpath = read-host -Prompt 'enter folder path'
$data = import-csv "C:\listofnames.csv"
foreach ($d in $data) {
    Get-ChildItem $folderpath -Filter *.pdf |  
    foreach-object { rename-item -path "$folderpath\$_" "$($d.firstname) $($d.lastname).pdf" } 
}

如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

问题可能在于您使用<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta charset="UTF-8"> <title>The pgrogress</title> </head> <body> <div class="container-fluid"> <div class="progress"> <div class="progress-bar" id="lone" role="progressbar" style="width: 0" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"></div> </div> <div class="for"> <button class="but">Button</button> </div> </div> </body> </html>的方式:

请注意,您不需要使用Rename-Item,因为Rename-Item已经遍历输入。

ForEach-Object

投机时间:

我注意到,如果每个文件夹只有一个文件要重命名,那么您的脚本可能才有效。请注意,foreach ($d in $data) { Get-ChildItem $folderpath -Filter *.pdf | Rename-Item -newname {"$($d.firstname) $($d.lastname).pdf" } } 可能会返回多个文件,但这两个文件都将被命名为Get-ChildItem,这将完全返回您的错误。我建议你检查你的代码结构。

修改

实际上,在重新阅读推测后的答案并看到其他答案后,我注意到我的代码无法帮助您避免这种结构性问题。如果不是&#34;将此文件夹中的所有pdf文件重命名为完全相同的名称&#34; (这实际上是不可能的),您必须澄清您想要做什么。有多个文件)。

答案 1 :(得分:0)

$folderpath = read-host -Prompt 'enter folder path'
$data = import-csv "C:\listofnames.csv"
foreach ($d in $data) { ***
  

代表文件中的每个名称

    Get-ChildItem $folderpath -Filter *.pdf |  <---
  

你正在审阅每一个pdf

    foreach-object { rename-item -path "$folderpath\$_" "$($d.firstname) $($d.lastname).pdf" } 
  

并尝试使用此人的姓名重命名每个PDF文件。

您需要重新考虑这一点,并找出一种方法来将数字映射到一个名称,或者希望您的pdf数量列表与您的名字数量相匹配以完成任何事情。

这不会很漂亮,但这会做你想的(我会在运行之前完全复制所有这些文件......):

$pdfs = get-childitem $folderpath -Filter *.pdf
0..($data.count-1)|%{
rename-item -path $(split-path $pdf[$_].fullname -parent) -newname "$($data[$_].firstname) $($data[$_].lastname).pdf"
}