PowerShell 为循环错误重命名文件夹中的文件
PowerShell Rename Files in Folder For Loop Error
我正在尝试批量重命名一个文件夹中的一堆 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 然后给我这个(“它要求我输入,我正在输入数字......它无处可去):
我做错了什么?
这应该可以解决问题:
$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到图片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++
技巧来自 ,归功于 mklement0。
Get-Content
reads content from a file or stream, but you want to read the filenames in a directory. Get-ChildItem
是一种方法;指定您的路径或使用当前目录,如下所示。
不要忘记按扩展名过滤,*.json
。
我不确定您是真的想要序列号还是想要从文件名中提取的数字。如果是后者,你可以试试:
$files = Get-ChildItem *.json
foreach ($file in $files) {
$newfile = $file -replace '(?<=\)Image (\d+)\.json$', ''
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".
What if: Performing the operation "Rename File" on target "Item: C:\Users\foo\Desktop\test\Image 2.json Destination: C:\Users\foo\Desktop\test".
What if: Performing the operation "Rename File" on target "Item: C:\Users\foo\Desktop\test\Image 3333.json Destination: C:\Users\foo\Desktop\test33".
我正在尝试批量重命名一个文件夹中的一堆 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 然后给我这个(“它要求我输入,我正在输入数字......它无处可去):
我做错了什么?
这应该可以解决问题:
$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到图片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++
技巧来自
Get-Content
reads content from a file or stream, but you want to read the filenames in a directory. Get-ChildItem
是一种方法;指定您的路径或使用当前目录,如下所示。
不要忘记按扩展名过滤,*.json
。
我不确定您是真的想要序列号还是想要从文件名中提取的数字。如果是后者,你可以试试:
$files = Get-ChildItem *.json
foreach ($file in $files) {
$newfile = $file -replace '(?<=\)Image (\d+)\.json$', ''
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".
What if: Performing the operation "Rename File" on target "Item: C:\Users\foo\Desktop\test\Image 2.json Destination: C:\Users\foo\Desktop\test".
What if: Performing the operation "Rename File" on target "Item: C:\Users\foo\Desktop\test\Image 3333.json Destination: C:\Users\foo\Desktop\test33".