Board logo

标题: [文件操作] 获取指定路径下最新文件的信息 [打印本页]

作者: 樵夫    时间: 2018-3-29 11:06     标题: 获取指定路径下最新文件的信息

获取指定路径下(例如:d:\bakup)文件类型(例如:.bak)最新修改时间(例如:文件修改时间或创建时间)的信息(例如:完整文件路径、文件名称、文件大小(单位用:GB))
作者: 樵夫    时间: 2018-3-29 11:08

结果例如:
d:\bakup DB_20180329.bak 34G
作者: 樵夫    时间: 2018-3-29 11:32

怎么没有人回复的。唉唉
作者: Batcher    时间: 2018-3-29 11:49

BAT直接计算GB不太方便,需要用点别的手段。
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /od "D:\bakup\*.bak" ') do (
  3.     echo %%~fi %%~zi
  4. )
  5. pause
复制代码

作者: 樵夫    时间: 2018-3-29 14:05

回复 4# Batcher


    不行额,我要最新的那一条。你这个全都提取出来了
作者: Batcher    时间: 2018-3-29 14:54

回复 5# 樵夫
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /od "D:\bakup\*.bak" ') do (
  3.     set "FilePath=%%~fi"
  4.     set "FileSize=%%~zi"
  5. )
  6. echo %FilePath%
  7. echo %FileSize%
  8. pause
复制代码

作者: 樵夫    时间: 2018-3-29 15:48

回复 6# Batcher


    这个结果文件大小不是GB单位的额
作者: yhcfsr    时间: 2018-3-29 21:40

本帖最后由 yhcfsr 于 2018-3-29 22:48 编辑

1.备份源文件
2.此为powershell脚本,保存为ps1扩展名文件,右键单击脚本,以powershell运行
3.未对powershell进行过设置的,可以管理员身份运行CMD,复制以下命令到命令提符 以解除脚本限制
  1. powershell -c "set-executionpolicy unrestricted"
复制代码
当然也可以管理员运行POWERSHELL,输入以下命令解除脚本限制
  1. set-executionpolicy unrestricted
复制代码
​4. WIN10以下系统如出错,可能需要去微软官网下载补丁升级powershell
  1. dir * -r -File|%{if (($t-$_.CreationTime) -lt 0){$t=$_.CreationTime;$f=$_}  }
  2. $flag=($f.Length -shr 30);
  3. if ($**){$size=($f.Length / 1GB);$Unit='GB'} else { $size=($f.Length / 1MB); $Unit='MB'}
  4. $size="{0:0.00}" -f $size
  5. Write-Host $f.FullName ' -- ' $size $Unit -fore green
复制代码

作者: WHY    时间: 2018-3-29 23:27

  1. PowerShell "(dir *.rar -Recurse|sort LastWriteTime)[-1]|select DirectoryName,Name,@{n='Size';e={($_.Length/1gb).ToString('0.00GB')}}"
复制代码

作者: WHY    时间: 2018-3-29 23:30

本帖最后由 WHY 于 2018-3-31 23:36 编辑

2018-3-30 修改:去掉 dir /b /o-d /a-d /s 中的 /s
dir 加上 /o-d 和 /s 参数以后遍历子目录并按日期排序时,分别将各个子目录中的文件排序,不是所有文件排序,这与 PowerShell 不同。

2018-3-31 修改:脚本微调,减少循环次数。

脚本思路:
1.文件大小的值可能很大,超出 cmd 的限制(2^31),不能直接当作被除数来计算
  如果直接把 1GB(2^30)当作除数来计算,也可能超出限制
2.在文件大小这个字符串的后面补两个0,扩大100倍
3.假定扩大100倍后文件大小不超过 20 位,事实上不可能超出 20 位,分两步计算:
  a.从第 8 位开始到第 20 位,模拟笔算的方式除以 134217728(2^27)
  b.结果再直接除以 8(2^3)
4.最终结果取两位小数(缩小100倍)
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /o-d /a-d *.rar') do (
  3.     setlocal enabledelayedexpansion
  4.     set "sz=%%~zi00"
  5.     set "Rem=!sz:~0,8!"
  6.     rem Div=被除数; Rem=余数; Quo=商; Ret=结果
  7.     for /L %%j in (8 1 20) do (
  8.         if not "!sz:~%%j!" == "" (
  9.             set "Div=!Rem!!sz:~%%j,1!"
  10.             set /a Rem = Div %% 134217728, Quo = Div / 134217728
  11.             if "!Rem!" == "0" (set "Rem=")
  12.             set "Ret=!Ret!!Quo!"
  13.         )
  14.     )
  15.     set "Ret=000000000!Ret!"
  16.     set /a "Ret = (1!Ret:~-9! - 1000000000) / 8"
  17.     if !Ret! LSS 100 (set "Ret=000!Ret!" & set "Ret=!Ret:~-3!")
  18.     for /f %%j in ("!Ret:~0,-2!.!Ret:~-2!") do (
  19.         endlocal
  20.         for %%k in ("%%~dpi.") do echo;%%~fk %%~nxi %%jGB
  21.     )
  22.     pause & exit /b
  23. )
复制代码

作者: zaqmlp    时间: 2018-3-30 00:53

  1. @echo off
  2. for /f "delims=" %%a in ('dir /a-d/b/o-d *.bak') do (
  3.     if not defined filename (
  4.         set "file=%%~fa"
  5.         set "filepath=%%~dpa"
  6.         set "filename=%%~nxa"
  7.         set "filesize=%%~za"
  8.     )
  9. )
  10. echo;%file%
  11. echo;%filepath%
  12. echo;%filename%
  13. echo;%filesize% B
  14. for /f %%a in (
  15.     'mshta "VBScript:CreateObject("Scripting.Filesystemobject").GetStandardStream(1).Write(FormatNumber(%filesize%/1073741824,2,-1))(close)"'
  16. ) do set formatsize=%%a
  17. echo;%formatsize% GB
  18. pause
复制代码

作者: 樵夫    时间: 2018-3-30 10:04

回复 10# WHY


    可用,完美符合要求。多谢啦!
作者: 樵夫    时间: 2018-3-30 11:56

回复 10# WHY


    能不能再帮忙改一下:在结果中加多一个显示 这个结果文件的生成或者是修改日期?
作者: 樵夫    时间: 2018-3-30 17:46

回复 10# WHY


    还在么
作者: WHY    时间: 2018-3-31 23:41

回复 13# 樵夫


    第24行:
for %%k in ("%%~dpi.") do echo;%%~ti %~fk %%~nxi %%jGB




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2