PowerShell重命名文件夹中的文件For循环错误

Posted

技术标签:

【中文标题】PowerShell重命名文件夹中的文件For循环错误【英文标题】:PowerShell Rename Files in Folder For Loop Error 【发布时间】:2021-09-14 18:43:12 【问题描述】:

我正在尝试批量重命名文件夹中的 1000 个 *.json 文件,但我在实际执行脚本时遇到了麻烦。

每个文件都以递增方式命名: “图像 1.json”、“图像 2.json”、......“图像 1000.json”

我想将它们重命名为不带扩展名的整数 (-1)(我知道这听起来很奇怪,但必须这样做)。 所以

    “图像1.json”变为:0 “图像2.json”变为:1 “图像 423.json”变为:422 “图片1000.json”变成:998

为了不搞砸,我创建了一个只有前 10 个文件的测试文件夹:

我保存了它:C:\test\testfolder

这是我的脚本

$files = Get-Content
$x = 0
foreach ($file in $files) 
   Rename-Item $file $x
   $x++

我将脚本保存在:C:\test\rename.ps1

在 PowerShell 中,我导航到目录:

cd c:\test\testfolder\

然后在 PowerShell 中运行脚本

C:\test\rename.ps1

Power shell 然后给了我这个(“它要求我输入,我正在输入数字......它无处可去):

我做错了什么?

【问题讨论】:

[1] 尝试使用参数名称,而不是仅仅在 cmdlet 中抛出值并希望它们坚持正确的参数。 [grin] ///// [2] 你试过重命名删除非数字的文件吗? 【参考方案1】:

这应该可以解决问题:

$folder = 'X:\path\to\jsonfolder'
$i = 0
Get-ChildItem -Path $folder -Filter *.json |
Sort-Object  [int][regex]::Match($_.BaseName,'\d+').Value  |
Rename-Item -NewName  [string]([ref]$i).Value++ 

Sort-Object 之所以存在,是因为通过文件的命名,如果没有它,您将从 Image 1.json 跳转到 Image 10 .json 等等:

-a----          7/2/2021   7:32 PM              2 Image 1.json    
-a----          7/2/2021   7:32 PM              2 Image 10.json   
-a----          7/2/2021   7:32 PM              2 Image 100.json  
-a----          7/2/2021   7:32 PM              2 Image 1000.json 
-a----          7/2/2021   7:32 PM              2 Image 101.json  
-a----          7/2/2021   7:32 PM              2 Image 102.json  

([ref]$i).Value++ 技巧来自 this awesome answer,归功于 mklement0。

【讨论】:

当我看到这个的时候,我也在想这个答案!好东西! @AbrahamZinala 我们很幸运有他在身边,对吧? :P【参考方案2】:

Get-Contentreads content from a file or stream,但您想读取目录中的文件名。 Get-ChildItem 是一种方法;指定您的路径或使用当前目录,如下所示。

别忘了按扩展名过滤,*.json

我不确定您是真的想要序列号还是想要从文件名中提取的数字。如果是后者,你可以试试:

$files = Get-ChildItem *.json

foreach ($file in $files) 
    $newfile = $file -replace '(?<=\\)Image (\d+)\.json$', '$1'
    Rename-Item $file $newfile -WhatIf

如果您想真正完成这项工作,请删除 -WhatIf

示例运行:

    Directory: C:\Users\foo\Desktop\test


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          7/2/2021     15:12              6 Image 1.json
-a----          7/2/2021     15:12              6 Image 2.json
-a----          7/2/2021     15:12              6 Image 3333.json
-a----          7/2/2021     15:46            250 rename.ps1


PS C:\Users\foo\Desktop\test> .\rename.ps1
What if: Performing the operation "Rename File" on target "Item: C:\Users\foo\Desktop\test\Image 1.json Destination: C:\Users\foo\Desktop\test\1".
What if: Performing the operation "Rename File" on target "Item: C:\Users\foo\Desktop\test\Image 2.json Destination: C:\Users\foo\Desktop\test\2".
What if: Performing the operation "Rename File" on target "Item: C:\Users\foo\Desktop\test\Image 3333.json Destination: C:\Users\foo\Desktop\test\3333".

【讨论】:

以上是关于PowerShell重命名文件夹中的文件For循环错误的主要内容,如果未能解决你的问题,请参考以下文章

For循环复制粘贴文件夹并使用增量重命名它

如何在 PowerShell 中使用条件语句重命名文件

使用 Powershell 递归重命名文件

powershell 通过从文件名中删除“&”来重命名目录中的文件。

Powershell 文件重命名语法

使用 PowerShell 重命名 FTP 上的文件