在Powershell中批量重命名文件并向每个文件名添加计数

时间:2019-04-09 07:29:01

标签: powershell count rename bulk

我可以批量重命名目录中的文件,也可以用计数代替每个文件名,但是我需要将两者结合起来。

批量重命名(保留原始名称的前2个字符):

Get-ChildItem * |  
    Rename-Item -NewName { $_.BaseName.Split('-')[0] + $_.Extension }

(我知道是部分硬编码的解决方案!)

或者,添加计数:

$count = 1
Get-ChildItem * | % { Rename-Item $_ -NewName (‘{0}.xlsx’ -f $count++) }

(我什至都​​不梦想尾随0)

我试图将两者结合起来,但无济于事。我在做什么错了?

我的尝试失败:

$count = 1 
Get-ChildItem * |
    Rename-Item -NewName { $_.BaseName.Split('-')[0] -f $count++ + $_.Extension }

2 个答案:

答案 0 :(得分:1)

您误解了format operator的工作方式。您需要带有占位符( std::vector<std::vector<int>> getAllMonomials(int order, int dimension) { std::vector<std::vector<int>> to_return; if (1 == dimension) { for (int i = 0 ; i <= order; i++){ to_return.push_back({i}); } return to_return; } for (int i = 0 ; i <= order; i++) { std::vector<std::vector<int>> all_options_with_this_var_at_degree_i = getAllMonomials(order - i, dimension - 1); for (int j = 0; j < all_options_with_this_var_at_degree_i.size(); j++) { all_options_with_this_var_at_degree_i.at(j).insert(all_options_with_this_var_at_degree_i.at(j).begin(), i); } to_return.insert(to_return.end(), all_options_with_this_var_at_degree_i.begin(), all_options_with_this_var_at_degree_i.end()); } return to_return; } )的格式字符串,以使该运算符起作用。我也建议在该表达式周围加上分组括号,即使在这种情况下不需要这样做。只是为了安全起见。

{0}

话虽如此,您显然想将计数器变量的值附加到原始文件名中的片段上,而不是将该片段用作格式字符串。为此,您可以简单地将计数器连接到片段,就像使用扩展一样。

为使计数器正常工作,您还需要指定正确的范围。每次重命名文件时,使用方式都会在脚本块的本地范围内定义一个新变量('foo {0} bar' -f $some_var) + $other_var ,因此父范围内的变量$counter永远不会递增。使用$counterscript:范围修饰符可获取您实际打算使用的变量。

global:

如果您确实想使用格式运算符而不是字符串连接($count = 1 Get-ChildItem * | Rename-Item -NewName { $_.BaseName.Split('-')[0] + $script:count++ + $_.Extension } ),则可以这样使用它:

+

答案 1 :(得分:-1)

要计算$ count,必须循环进行。

$count = 1 
Get-ChildItem * | foreach-object { Rename-Item -NewName { $_.BaseName.Split('-')[0] -f 
 count++ + $_.Extension } }

%是您在“添加计数”方法中使用的foreach-object cmdlet的别名。 刚刚将其添加到失败的尝试中。

相关问题