【问题标题】:How to loop through files and rename using PowerShell?如何使用 PowerShell 循环文件和重命名?
【发布时间】:2021-06-17 03:49:25
【问题描述】:

我想将文件夹中的所有 jpg 文件重命名为统一约定,例如 Picture00000001.jpg 其中 00000001 是计数器。

这将是在 C# 中的公园散步,但我认为这是 PowerShell 的主要用途。

我猜是这样的

$files = ls *.jpg
$i=0
foreach($f in $files) { Rename-Item $f -NewName "Picture"+($i++)+".jpg" }

但在我对此有所了解之前,我想 1) 格式化计数器,以及 2) 感觉这实际上是一个好主意。

如果这听起来更像是强迫症而不是一个好主意,请说出来。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您可以在 PowerShell 中相当简单地做到这一点:

    ls *.jpg | Foreach -Begin {$i=1} `
       -Process {Rename-Item $_ -NewName ("Picture{0:00000000}.jpg" -f $i++) -whatif}
    

    如果您正在寻找“basename”并且如果您使用的是 PowerShell 2.0,只需使用 PowerShell 添加到每个 FileInfo 对象的 Basename 属性:

    ls *.jpg | Format-Table Basename
    

    请注意,在 PowerShell 1.0 上,PowerShell Community Extensions 添加了相同的 Basename 属性。

    如果打算在重命名操作期间将计数器字符串附加到文件的基本名称,请尝试以下操作:

    ls *.jpg | Foreach {$i=1} `
       {Rename-Item $_ -NewName ("$($_.Basename){0:00000000#}.jpg" -f $i++) -whatif}
    

    【讨论】:

    • 抱歉标题和问题之间的脱节 -- 我已经更改了标题。
    • 哇,你可以分别给ForEach-Object 一个beginprocess 脚本块吗?我必须重新审视一些打高尔夫球的体育问题。
    • 嗯,我只是想知道 为什么 这有效。文档没有说明 -Begin-End 参数到 ForEach-Object 是位置。魔法?
    • 是的,我隐式使用了参数 -begin 和 -process,所以我更新了一个示例以明确说明这一点。通常,当您使用 Foreach 时,您是在“位置”使用您提供的脚本块的 -Process 参数。不确定位置“魔术”在 Begin/End 案例中是如何工作的,但从早期开始就是这样。
    • 啊,我只是有点困惑。很清楚两个(或三个)脚本块的作用,但help % -param begin 只告诉我“命名”是这里唯一的可能性。 help % 中也没有针对这种情况的示例或其他文档。这就是我想知道的原因。但很高兴知道这行得通。
    【解决方案2】:

    试试这个来获取 FilenameWithOutExtension

    $f.DirectoryName + "\" + $f.BaseName
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-22
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多