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-Content
reads 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循环错误的主要内容,如果未能解决你的问题,请参考以下文章