【问题标题】:How can I rename files by prepending a sequence number to the original file names?如何通过在原始文件名前添加序列号来重命名文件?
【发布时间】:2021-09-08 08:53:54
【问题描述】:

有谁知道我该怎么做?我试图通过在文件名的开头添加 1、2、3 等以数字顺序列出一些文件,同时保留文件的原始名称。

这是我尝试过的代码

$nr = 1

Dir -path C:\x\y\deneme | %{Rename-Item $_ -NewName (‘{0} $_.Name.txt’ -f $nr++ )}

dir | select name

此代码只是对文件进行排序,如 1、2、3... 而不保留原始名称。


$n = 1
Get-ChildItem *.txt | Rename-Item -NewName { $_.Name -replace $_.Name ,'{0} $_.Name' -f $n++}

这个并没有像我想象的那样工作。

【问题讨论】:

  • 所以你不想真正重命名它们?
  • “这个不像我想象的那样工作。” - 你能告诉我们它是如何工作的吗? :-)
  • @MathiasR.Jessen 实际上它什么也没做。它使文件名保持不变。
  • @AbrahamZinala 我只想通过添加数字来重命名它们,但我想保留文件的名称。
  • 好吧,你确实想复制文件...

标签: powershell file-rename sequential-number


【解决方案1】:

是的,我同意@Abraham,我没有看到您可以重命名文件但也保留原始文件而不复制它们的场景: )

这应该可以解决问题:

$i = 0; Get-ChildItem x:\path\to\files | ForEach-Object {
    $i++
    $destPath = Join-Path $_.DirectoryName -ChildPath "$i $($_.Name)"
    Copy-Item -Path $_.FullName -Destination $destPath
}

示例:

Mode                 LastWriteTime         Length Name                                                                                                                    
----                 -------------         ------ ----                                                                                                                    
-a----         6/24/2021   7:08 PM              2 1 testfile0.txt
-a----         6/24/2021   7:08 PM              2 2 testfile1.txt
-a----         6/24/2021   7:08 PM              2 3 testfile2.txt
-a----         6/24/2021   7:08 PM              2 4 testfile3.txt
-a----         6/24/2021   7:08 PM              2 5 testfile4.txt
-a----         6/24/2021   7:08 PM              2 testfile0.txt  
-a----         6/24/2021   7:08 PM              2 testfile1.txt  
-a----         6/24/2021   7:08 PM              2 testfile2.txt  
-a----         6/24/2021   7:08 PM              2 testfile3.txt  
-a----         6/24/2021   7:08 PM              2 testfile4.txt  

【讨论】:

    【解决方案2】:

    尝试以下操作,重命名当前目录中的所有 .txt 文件。通过在它们前面加上一个序列号:

    $n = 1
    Get-ChildItem *.txt | 
      Rename-Item -WhatIf -NewName { '{0} {1}' -f ([ref] $n).Value++, $_.Name }
    

    注意:上面命令中的-WhatIf common parameter预览操作。一旦您确定该操作将执行您想要的操作,请删除 -WhatIf

    ([ref] $n).Value++ 技巧弥补了delay-bind script blocks 在调用者的 范围内运行的事实,其中调用者的变量是可见,但应用@ 987654331@(或赋值)创建变量的临时、本地副本(有关 PowerShell 范围规则的概述,请参阅this answer)。
    [ref] $n 实际上返回对调用者的变量对象,然后可以更新其.Value 属性。


    至于你尝试了什么

    • '{0} $_.Name.txt',作为引用的字符串,由PowerShell逐字解释;您不能在此类字符串中嵌入变量引用;为此,您需要 double-引用("...",并且您还需要 $(...) 以嵌入 表达式,例如 $_.Name) - 请参阅this answer 的底部部分概述了 PowerShell 的字符串文字。

    【讨论】:

    • 好吧,我试图找到一种在Rename-Item ScriptBlock 中增加$n 的方法...我想我今天学到了一些新东西,一次又一次,哈哈,你真是太棒了!
    • @SantiagoSquarzon :) 行为 - 以及解决方案 - 绝对是晦涩难懂的;如果您对相关的概念讨论感兴趣,请参阅GitHub issue #
    • @AbrahamZinala :) 也许我之前评论中的 GitHub 链接会有所帮助。除了([ref] $n).Value++,还有一个不那么晦涩但更冗长的替代方案,那就是(Get-Variable n -Scope 1).Value++——如果你可以假设调用者是脚本的(顶级)范围,$script:n++
    • 我的意思是说,在 Copy-Item-Destination {...} 脚本块中,尝试它也很完美,除了文件被复制到当前目录而不是 gci 所在的目录也指向(希望它有意义)因此我使用 Join-Path 将文件复制到实际文件所在的位置。
    • @SantiagoSquarzon,是的,只有 Rename-Item-NewName 参数,其参数只能是文件 name,才能保证引用与输入路径相同的目录。
    猜你喜欢
    • 2021-04-02
    • 1970-01-01
    • 2011-12-23
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 2012-09-29
    相关资源
    最近更新 更多