【发布时间】:2022-01-10 09:01:50
【问题描述】:
我在文件夹中有以下同名文件。只有扩展名不同。所有文件都是有效的 jpg,但扩展名错误。
如何将它们重命名为 .jpg,并使用不同的前缀?
ren *.* *.jpg ----> 不适合我,因为它们都有相同的前缀
【问题讨论】:
标签: powershell batch-file command-line windows-administration
我在文件夹中有以下同名文件。只有扩展名不同。所有文件都是有效的 jpg,但扩展名错误。
如何将它们重命名为 .jpg,并使用不同的前缀?
ren *.* *.jpg ----> 不适合我,因为它们都有相同的前缀
【问题讨论】:
标签: powershell batch-file command-line windows-administration
您可以在命令提示符、PowerShell 提示符或批处理文件中使用ForFiles 实用程序来执行此类任务。
forfiles /p "C:\directory\with\images" /m "1.*" /c "cmd /c ren @file image.@ext.jpg"
【讨论】:
这应该适合你:
Clear-Host
$directoryPath = "C:\directory\with\images"
#Getting all files with "1.*" from $directoryPath
$foldercontent = Get-ChildItem -Path $directoryPath -Filter "1.*" | Where-Object { ! $_.PSIsContainer }
foreach($item in $foldercontent) {
Move-Item -Path $item.FullName -Destination "$directoryPath\image$($item.Extension).jpg"
}
文件名将是:
image.J84.jpg
image.J85.jpg
【讨论】:
$foldercontent = Get-ChildItem -Path "C:\tmp" -Filter "1.*" | Where-Object { ! $_.PSIsContainer }; foreach($item in $foldercontent) { Move-Item -Path $item.FullName -Destination "C:\tmp\image$($item.Extension).jpg" };
可以使用以下批处理文件将1.J73之类的文件重命名为image_73.jpg:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "ImageFolder=C:\directory\with\images"
for /F "tokens=2 delims=Jj." %%I in ('dir "%ImageFolder%\1.J*" /A-D /B 2^>nul') do ren "%ImageFolder%\1.J%%I" "image_%%I.jpg"
endlocal
通过命令行在后台又执行了一个命令进程:
C:\Windows\System32\cmd.exe /c dir "C:\directory\with\images\1.J*" /A-D /B 2>nul
DIR在指定目录中搜索
/A-D(属性不是目录)1.J*和/B 将找到的文件名不带路径以裸格式输出到后台命令进程的句柄STDOUT(标准输出)。DIR 将输出一条错误消息来处理 STDERR(标准错误),因为找不到任何匹配的文件。通过使用 2>nul 将其重定向到设备 NUL 来抑制此错误消息。
阅读有关 Using command redirection operators 的 Microsoft 文档,了解有关 2>nul 的说明。重定向运算符 > 必须在 FOR 命令行上使用插入字符 ^ 进行转义,以便在 Windows 命令解释器在执行命令 FOR 之前处理此命令行时解释为文字字符> 在后台启动的单独命令进程中执行嵌入的dir 命令行。
DIR 到 STDOUT 的输出由 Windows 命令处理器 cmd.exe 处理批处理文件并在启动 cmd.exe 关闭后逐行处理。
FOR 带有选项/F 忽略此处不出现的空行。默认情况下,非空行将使用普通空格和水平制表符作为字符串分隔符拆分为子字符串。接下来将检查第一个子字符串的第一个字符是否为分号,分号默认为行尾字符,在这种情况下,该行将被忽略以进行进一步处理。否则将第一个子字符串分配给指定的循环变量,FOR 循环体中的命令由cmd.exe 执行。
行处理的默认行为由使用的选项tokens=2 和delims=Jj. 修改。字符串分隔符用J 和j 和. 重新定义,这意味着像1.J73 这样的文件名被分成两个子字符串1 和73。选项tokens=2 指示FOR 将第二个子字符串(令牌)分配给指定的循环变量I。默认的eol=; 被保留,因为在这种情况下第一个子字符串总是1,因此这里没有文件名被忽略。因此对于名称为1.J73 或1.j73 的文件,字符串73 被分配给循环变量I。
然后重命名命令 REN 使用当前文件的完全限定文件名和带有前缀 image_ 的新文件名和来自现有文件名的文件编号和文件扩展名执行.jpg。因此,如果还没有名称为 image_73.jpg 的文件并且应用程序当前未以阻止重命名文件的方式打开要重命名的文件,则该文件将从 1.J73 重命名为 image_73.jpg应用。
要了解所使用的命令及其工作原理,请打开command prompt 窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
cmd /?dir /?echo /?endlocal /?for /?ren /?set /?setlocal /?【讨论】: