【问题标题】:Recursive rename-item -NewName syntax递归重命名项 -NewName 语法
【发布时间】:2019-05-25 01:18:57
【问题描述】:

我几乎没有 powershell 经验,但我用它作为一种手段来替换 FAT32 文件名中可能有问题的字符,例如: , . / ' : 等等。

我发现一篇文章提出使用 rename-item -NewName 命令,该命令在包含满足上述条件的文件的特定目录中运行良好,但在高于此级别使用时,我不能弄清楚如何使脚本完全递归。

我想替换文件扩展名之外的空格、撇号、句点实例和音乐库文件夹中音轨文件名中的美元符号,该文件夹的布局如下**,从 music 运行 powershell 脚本strong> 文件夹以点击其内部和下方的所有内容:

X:\home\audio\**music**\[artist_here]\[album_here]\FILE.mp3

有人可以解释完成此操作的正确语法吗?

我也尝试过使用路径和/s:

dir X\pathnamehere\ /s | rename-item -NewName {$_.name -replace " ","_"}

但收到另一个错误:

dir : Second path fragment must not be a drive or UNC name.
Parameter name: path2
At line:1 char:1
+ dir X:\home\Audio\Music\ /s | rename-item -NewName {$_.name -repla ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidArgument: (X:\home\Audio\Music:String) 
[Get-ChildItem], ArgumentException
+ FullyQualifiedErrorId : 
DirArgumentError,Microsoft.PowerShell.Commands.GetChildItemCommand

dir | rename-item -NewName {$_.name -replace " ","_"}

运行时

dir | rename-item -NewName {$_.name -replace " ","_"}

在要重命名的文件所在的多个级别上,对于 \music 中的每个目录,我都会收到以下 错误:

"rename-item : Source and destination path must be different." 

+ dir | rename-item -NewName {$_.name -replace " ","_"}
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : WriteError: 
(X:\home\Audio\Music\artistname:String) [Rename-Item], IOException
+ FullyQualifiedErrorId : 
RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

谢谢!

附:如果这可以通过更简单的命令提示符批处理文件来完成,请随时赐教。

【问题讨论】:

    标签: windows powershell batch-file


    【解决方案1】:

    在这里找到了解决方案: Recursively renaming files with Powershell

    这是他们的例子:

    Get-ChildItem -File -Recurse | % { Rename-Item -Path $_.PSPath -NewName $_.Name.replace(".mkv.mp4",".mp4")}
    

    在 powershell 中,Dir 是 Get-ChildItem 的别名,% 是 'ForEach'。你已经很接近了。

    【讨论】:

    • 谢谢!这是有效的。我如何链接多个替换标准?我应该分开多个 Get-ChildItem -File - Recurse | ...." 带有 ; 每个都有不同的 $_.Name.replace("X","y") 的命令?或者有没有办法在同一个命令中将多个替换选项串起来?重命名文件夹和文件只需要一个额外的 switch ala 文件,否则会变得复杂吗?
    • 我认为您可以通过执行 -NewName $_.Name.replace(".mkv.mp4",".mp4").replace("foo","bar" 来指定添加替换语句).replace("even","more")} Rename-item 对文件夹的作用与对文件的作用相同。但是您的 get-childitem 永远不会将文件夹提供给管道。但是,您可能希望将其作为单独的命令运行,因为您可能会遇到被重命名而您不希望被重命名的东西,
    • Rename-Item 接受管道输入,ForEach-Object 不是必需的 => Get-ChildItem -File -Recurse | Rename-Item -NewName {$_.Name.replace(".mkv.mp4",".mp4")}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 2020-11-23
    • 2011-01-11
    • 2018-11-26
    • 2021-04-09
    • 1970-01-01
    相关资源
    最近更新 更多