[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 【已解决】求助批处理将时间戳转换为时间格式重命名文件

本帖最后由 meiszp 于 2024-7-26 14:52 编辑

文件夹下有许多jpg,mp4,文件名为13位时间戳或前缀+13位时间戳,希望将13位时间戳转化为时间格式,重命名所有jpg,mp4。
例如:
文件名1721956888116.jpg,,时间戳1721878336转换为时间2024-07-26 09:21:28,重命名为202240726-092128.jpg   
文件名abc1721956922355.mp4,时间戳1721878383转换为时间2024-07-26 09:22:02,重命名为20240726-092202.mp4

可参考帖子
http://www.bathome.net/viewthread.php?tid=65212
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 aloha20200628 于 2024-7-26 11:20 编辑

回复 1# meiszp

以下代码存为 test.bat,置于 *.jpg/*.mp4 等目标文件所在目录中运行...
  1. @set @x=1 /* &echo off
  2. for /f "delims=" %%F in ('dir /b/a-d *.jpg *.mp4') do (
  3. set "a=%%~nF" &setlocal enabledelayedexpansion
  4. for /f "delims=" %%a in ('cscript /nologo /e:jscript "%~f0" "!a:~-13!" ') do ren "%%F" "%%a%%~xF"
  5. endlocal
  6. )
  7. pause&exit/b */
  8. v=WSH.arguments, t=new Date(Number(v(0)));
  9. Y=t.getFullYear(), M=t.getMonth()+1, D=t.getDate();
  10. h=t.getHours(), m=t.getMinutes(), s=t.getSeconds();
  11. ts=Y+(('0'+M).slice(-2))+(('0'+D).slice(-2))+'-'+(('0'+h).slice(-2))+(('0'+m).slice(-2))+(('0'+s).slice(-2));
  12. WSH.echo(ts), WSH.quit();
复制代码

TOP

啊 , 你这不是10位的吗

TOP

powershell
  1. $folder = "D:\test"
  2. Get-ChildItem -LiteralPath $folder | ForEach-Object {
  3. if ( $_.Name -match "\d{10}" ) {
  4. $dt = (Get-Date -Date "1970-01-01").AddSeconds($matches[0]).ToString("yyyy-MMdd-HHmmss")
  5. $newName = $_.Name -replace "\d{10}", $dt
  6. Rename-Item -LiteralPath $_.FullName -NewName $newName
  7. }
  8. }
复制代码

TOP

根据楼主提供的链接,以下代码处理13位时间戳。
  1. @echo off
  2. cd /d "%~dp0"
  3. set "str=powershell -c "Get-Date ([timezone]::CurrentTimeZone.ToLocalTime(([datetime]::new(1970,1,1,0,0,0)).AddMilliseconds"
  4. for /f "delims=" %%i in ('dir /b /a-d *.jpg *.mp4') do (
  5. set n=%%~ni
  6. setlocal enabledelayedexpansion
  7. for /f "tokens=1-6" %%a in ('%str%(!n:~-13!))) -UFormat '%%Y %%m %%d %%H %%M %%S'"') do (
  8. endlocal
  9. ren "%%i" "%%a%%b%%c-%%d%%e%%f%%~xi"
  10. )
  11. )
  12. pause
复制代码
bat小白,请多指教!谢谢!

TOP

回复 3# Five66
已改13位

TOP

回复 5# 77七
例子改成了13位,代码没有成功。

TOP

回复 4# newswan
谢谢热心回复。例子时间戳改为了13位,10位和13位代码运行都不成功。

TOP

回复 2# aloha20200628

谢谢回复,重命名成功,但代码转换的时间不对。

TOP

本帖最后由 aloha20200628 于 2024-7-26 11:35 编辑

回复 9# meiszp

2楼代码调整为针对 ‘13位时间戳’,已订正...

TOP

回复 8# meiszp

前面的10位没问题,测试过
这个支持10位,13位
保存位 a.ps1
第一行指示文件夹
  1. $folder = "D:\test"
  2. Get-ChildItem -LiteralPath $folder | ForEach-Object {
  3. if ( $_.Name -match "\d{10,13}" ) {
  4. $dt = (Get-Date -Date "1970-01-01").AddSeconds(($matches[0]).substring(0,10)).ToString("yyyy-MMdd-HHmmss")
  5. $newName = $dt + $_.Extension
  6. Rename-Item -LiteralPath $_.FullName -NewName $newName
  7. }
  8. }
复制代码
1

评分人数

TOP

本帖最后由 aloha20200628 于 2024-7-26 13:05 编辑

回复 9# meiszp

若批处改用powershell功能转换13位时间戳,可使2楼代码减点肥...
  1. @echo off &for /f "delims=" %%F in ('dir /b/a-d *.jpg *.mp4') do (
  2. set "a=%%~nF" &setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in (
  4. 'powershell "Get-Date ([timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970').AddmilliSeconds('!a:~-13!'))) -uformat '%%Y%%m%%d-%%H%%M%%S' " ') do ren "%%F" "%%a%%~xF"
  5. endlocal
  6. )
  7. pause&exit/b
复制代码
1

评分人数

TOP

回复 12# aloha20200628
谢谢,完美实现。

TOP

回复 11# newswan
谢谢!

TOP

回复 7# meiszp


   5楼代码,是测试过的。如果不成功,应该是代码被改动了,包括复制出错。
bat小白,请多指教!谢谢!

TOP

返回列表