无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 710|回复: 59
打印 上一主题 下一主题

[已解决] 悬赏500无忧币:解决PE下,用批处理“获取X盘的文件大小”出错的问题。谢谢

  [复制链接]
跳转到指定楼层
1#
500无忧币
本帖最后由 yyz2191958 于 2025-2-18 21:31 编辑

完美解决:
@set @x=1 /* &@echo off &::【代码(最前)和(最后)好像不能有字符。(z.toFixed(3)————3位小数)】
if "%~1"=="" exit /b 3
if not exist %1 exit /b 3
set "v=" &set "v=%~1"
set "q=0"
dir /ad %1 >nul 2>&1
if %errorlevel% equ 0 (set "q=1") else if exist "%v%" (for %%v in ("%v%") do set "v=%%~zv") else set "v=%v:,=%"
cscript /nologo /e:jscript "%~f0" "%v%" %q%
pause>nul 2>nul&exit/b */
n=0, v=WSH.arguments, q=v(1);
if (q==1) { z=WSH.createObject('scripting.fileSystemObject').getFolder(v(0)).size }
else z=+v(0);
while (z/1024>=1) {z/=1024; n++; if (n==6) break;}
z=z.toFixed(3)+[' 字节',' KB',' MB',' GB',' TB',' PB',' EB'][n];
WSH.echo(z), WSH.quit();

===============================================
原来的问题:
悬赏500无忧币:解决PE下,用批处理“获取X盘的文件大小”出错的问题。谢谢
*******************************************************************************
由于悬赏的无忧币,如果问题没有解决,不能够返回。由此,这里悬赏1无忧币,一旦问题解决,我会编辑为悬赏500无忧币给你。谢谢
*******************************************************************************
已有批处理“文件、文件夹(拖到图标)显示大小(有小数).bat”
=====================================================
@set @x=1 /* &@echo off  &::【代码(最前)和(最后)好像不能有字符。(z.toFixed(2)————两位小数)】
set "v=" &set "v=%1"
if not defined v (exit/b) else (set "q=0" &set v=%v:"=%)
if exist "%v%"\ (set "q=1") else if exist "%v%" (for %%v in ("%v%") do set "v=%%~zv") else set "v=%v:,=%"
cscript /nologo /e:jscript "%~f0" "%v%" %q%
pause>nul 2>nul&exit/b */
n=0, v=WSH.arguments, q=v(1);
if (q==1) { z=WSH.createObject('scripting.fileSystemObject').getFolder(v(0)).size }
else z=+v(0);
while (z/1024>=1) {z/=1024; n++; if (n==6) break;}
z=z.toFixed(2)+[' 字节',' KB',' MB',' GB',' TB',' PB',' EB'][n];
WSH.echo(z), WSH.quit();
=====================================================
目的:将“文件 或 文件夹”,拖到bat的图标上,就在窗口显示文件(文件夹)的大小(能够根据数数值的大小,自动显示为:字节、KB、MB、GB、TB、PB、EB)
=====================================================
目前情况:在 10 PE下(2013koko制作的:Win10PEx64_10586_网络版)
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=435502
将“文件 或 文件夹”拖到bat的图标上,拖c、d盘上的“文件 或 文件夹”没有问题。将X盘“文件 或 文件夹”拖到bat的图标上,文件夹没有问题,文件就提示:路径未找到。
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=444771&extra=
=====================================================
需要达到目的:
将“文件 或 文件夹”,拖到bat的图标上就在窗口显示文件(文件夹)的大小(能够根据数数值的大小,自动显示为:字节、KB、MB、GB、TB、PB、EB)(我的PE下 和 正常系统中都正常)(修改原有bat,或者自己写都行)


文件(夹)(小数)完美.rar

603 Bytes, 下载次数: 1, 下载积分: 无忧币 -2

最佳答案

查看完整内容

if not defined v (exit/b) else (set "q=0" &set v=%v:"=%) dir /ad %1 >nul 2>&1 if %errorlevel% equ 0 (set "q=1") else if exist "%v%" (for %%v in ("%v%") do set "v=%%~zv") else set "v=%v:,=%" cscript /nologo /e:jscript "%~f0" "%v%" %q% 事后更正:之前括号处理仍有问题,加粗红字为修正。推荐24楼改法。 另外注意%v%里含有括号时,例如“X:\Program Files (x86)”,批处理会出错,需要替换为^(和^)。 set " ...
2#
发表于 4 天前 | 只看该作者
本帖最后由 hua_wuxin 于 2025-2-18 15:07 编辑

if not defined v (exit/b) else (set "q=0" &set v=%v:"=%)
dir /ad %1 >nul 2>&1
if %errorlevel% equ 0
(set "q=1") else if exist "%v%" (for %%v in ("%v%") do set "v=%%~zv") else set "v=%v:,=%"
cscript /nologo /e:jscript "%~f0" "%v%" %q%

事后更正:之前括号处理仍有问题,加粗红字为修正。推荐24楼改法
另外注意%v%里含有括号时,例如“X:\Program Files (x86)”,批处理会出错,需要替换为^(和^)。
set "v=" &set "v=%1"
if defined v set v=%v:(=^(% &set v=%v:)=^)%
if not defined v (exit/b) else (set "q=0" &set v=%v:"=%)


点评

看来是 目录的判断方式上有点问题,遇到X盘时 if exsit "PATH"\  详情 回复 发表于 4 天前
是完整代码吗?我拖到图标无显示  详情 回复 发表于 4 天前
我试一试先 谢谢  详情 回复 发表于 4 天前

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

3#
 楼主| 发表于 4 天前 | 只看该作者
占楼备用

点评

@echo off setlocal enabledelayedexpansion if "%~1"=="" ( echo 请将文件或文件夹拖放到此脚本上。 pause exit /b ) set "item=%~1" set "size=0" if exist "!item!\" ( set "ps_  详情 回复 发表于 4 天前
这是要解决啥问题呢  详情 回复 发表于 4 天前
deepseek 都解决不了你这位批处理高手的问题?  详情 回复 发表于 4 天前
回复

使用道具 举报

4#
发表于 4 天前 | 只看该作者


deepseek 都解决不了你这位批处理高手的问题?
回复

使用道具 举报

5#
发表于 4 天前 | 只看该作者


这是要解决啥问题呢
回复

使用道具 举报

6#
发表于 4 天前 | 只看该作者

@echo off
setlocal enabledelayedexpansion

if "%~1"=="" (
    echo 请将文件或文件夹拖放到此脚本上。
    pause
    exit /b
)

set "item=%~1"
set "size=0"

if exist "!item!\" (
    set "ps_path=!item:'=''!"
    set "ps_path=!ps_path:\=\\!"
    for /f "delims=" %%a in ('powershell -Command "$sum=0; Get-ChildItem -LiteralPath '%ps_path%' -Recurse -File -ErrorAction SilentlyContinue | %% { $sum += $_.Length }; $sum"') do set "size=%%a"
) else (
    for %%F in ("!item!") do set "size=%%~zF"
)

for /f "tokens=1,2" %%i in ('powershell -Command "$bytes = !size!; $units = 'Bytes,KB,MB,GB,TB,PB,EB' -split ','; if ($bytes -eq 0) { '0 Bytes' } else { $i = [math]::Min([math]::Floor([math]::Log($bytes, 1024)), $units.Length-1); $fmt = '{0:N2} {1}' -f ($bytes/[math]::Pow(1024, $i), $units[$i]; Write-Output $fmt }"') do (
    set "value=%%i"
    set "unit=%%j"
)

echo 大小: !value! !unit!
pause

点评

'powershell' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 'powershell' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 大小: 请按任意键继续. . .  详情 回复 发表于 4 天前
这个批处理,使用了'powershell,这估计在PE下用不了  发表于 4 天前
请楼主测试修改  发表于 4 天前
回复

使用道具 举报

7#
发表于 4 天前 | 只看该作者
注意事项:

需要系统支持PowerShell(Windows 7及更新版本默认支持)

处理大型文件夹时可能需要较长时间

支持包含空格和特殊字符的路径

最大支持EB(字节,1,152,921,504,606,846,976字节)单位

这个脚本结合了批处理的便捷性和PowerShell的强大计算能力,能够高效准确地处理各种大小的文件和文件夹。
回复

使用道具 举报

8#
 楼主| 发表于 4 天前 | 只看该作者
martin313 发表于 2025-2-18 09:00
@echo off
setlocal enabledelayedexpansion

'powershell' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'powershell' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
大小:
请按任意键继续. . .

点评

这个批处理,在PE下肯定用不了。PE里一般不会含powershell组件。 这个批处理,在正常系统下,也没出正确结果,需要继续调试  详情 回复 发表于 4 天前
回复

使用道具 举报

9#
发表于 4 天前 | 只看该作者
用个对比文件不行吗?

点评

对比文件有什么用?  详情 回复 发表于 4 天前
回复

使用道具 举报

10#
发表于 4 天前 | 只看该作者
yyz2191958 发表于 2025-2-18 09:12
'powershell' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'powershell' 不是内部或外部命 ...

这个批处理,在PE下肯定用不了。PE里一般不会含powershell组件。

这个批处理,在正常系统下,也没出正确结果,需要继续调试
回复

使用道具 举报

11#
 楼主| 发表于 4 天前 | 只看该作者
忧心的启 发表于 2025-2-18 09:21
用个对比文件不行吗?

对比文件有什么用?
回复

使用道具 举报

12#
发表于 4 天前 | 只看该作者

这个批处理中,@x=1 是干啥的?会不会这个影响到了X盘的路径问题

点评

将@x=1弄成@M=1,情况还是一样  详情 回复 发表于 4 天前
我不知道,这些代码是 “批处理之家” 得到的 你说的是有可能的  详情 回复 发表于 4 天前
回复

使用道具 举报

13#
 楼主| 发表于 4 天前 | 只看该作者
martin313 发表于 2025-2-18 10:10
这个批处理中,@x=1 是干啥的?会不会这个影响到了X盘的路径问题

我不知道,这些代码是 “批处理之家” 得到的

你说的是有可能的
回复

使用道具 举报

14#
 楼主| 发表于 4 天前 | 只看该作者
martin313 发表于 2025-2-18 10:10
这个批处理中,@x=1 是干啥的?会不会这个影响到了X盘的路径问题

将@x=1弄成@M=1,情况还是一样
回复

使用道具 举报

15#
 楼主| 发表于 4 天前 | 只看该作者
hua_wuxin 发表于 2025-2-18 10:32
if not defined v (exit/b) else (set "q=0" &set v=%v:"=%)
dir /ad %1 >nul 2>&1
if %errorlevel% equ  ...

我试一试先 谢谢

点评

这个批处理,牛逼啊  详情 回复 发表于 4 天前
回复

使用道具 举报

16#
 楼主| 发表于 4 天前 | 只看该作者
hua_wuxin 发表于 2025-2-18 10:32
if not defined v (exit/b) else (set "q=0" &set v=%v:"=%)
dir /ad %1 >nul 2>&1
if %errorlevel% equ  ...

是完整代码吗?我拖到图标无显示

点评

不是 红字是改动的地方 黑字是你原文识别改动的位置用  详情 回复 发表于 4 天前
回复

使用道具 举报

17#
发表于 4 天前 | 只看该作者


这个批处理,牛逼啊
回复

使用道具 举报

18#
发表于 4 天前 | 只看该作者
X盘的系统文件或文件夹,无法计算大小,我猜是因为PE运行情形下,批处理没权限的原因吧

点评

文件夹没有问题,就是文件不行  详情 回复 发表于 4 天前
回复

使用道具 举报

19#
发表于 4 天前 | 只看该作者
yyz2191958 发表于 2025-2-18 10:49
是完整代码吗?我拖到图标无显示

不是
红字是改动的地方 黑字是你原文识别改动的位置用

点评

好像可以了,我慢慢认真测试先,非常感谢  详情 回复 发表于 4 天前
回复

使用道具 举报

20#
 楼主| 发表于 4 天前 | 只看该作者
martin313 发表于 2025-2-18 10:55
X盘的系统文件或文件夹,无法计算大小,我猜是因为PE运行情形下,批处理没权限的原因吧

文件夹没有问题,就是文件不行
回复

使用道具 举报

21#
 楼主| 发表于 4 天前 | 只看该作者
hua_wuxin 发表于 2025-2-18 10:57
不是
红字是改动的地方 黑字是你原文识别改动的位置用

好像可以了,我慢慢认真测试先,非常感谢

点评

但不知道,这用来干嘛呢?  详情 回复 发表于 4 天前
恭喜恭喜  详情 回复 发表于 4 天前
回复

使用道具 举报

22#
发表于 4 天前 | 只看该作者
yyz2191958 发表于 2025-2-18 11:07
好像可以了,我慢慢认真测试先,非常感谢

恭喜恭喜
回复

使用道具 举报

23#
发表于 4 天前 | 只看该作者
yyz2191958 发表于 2025-2-18 11:07
好像可以了,我慢慢认真测试先,非常感谢


但不知道,这用来干嘛呢?
回复

使用道具 举报

24#
发表于 4 天前 | 只看该作者
本帖最后由 hua_wuxin 于 2025-2-18 12:15 编辑

之前括号的处理还是有点问题,%1为空(例如直接双击批处理)时会报错。推荐如下改动:
@set @x=1 /* &@echo off  &::【代码(最前)和(最后)好像不能有字符。(z.toFixed(2)————两位小数)】
if "%~1"=="" exit /b 3
if not exist %1 exit /b 3
set "v=" &set "v=%~1"
set "q=0"
dir /ad %1 >nul 2>&1
if %errorlevel% equ 0 (set "q=1") else if exist "%v%" (for %%v in ("%v%") do set "v=%%~zv") else set "v=%v:,=%"
cscript /nologo /e:jscript "%~f0" "%v%" %q%

(以下未动,略)


点评

谢谢 我再试一试  详情 回复 发表于 4 天前
回复

使用道具 举报

25#
 楼主| 发表于 4 天前 | 只看该作者
hua_wuxin 发表于 2025-2-18 11:27
之前括号的处理还是有点问题,%1为空(例如直接双击批处理)时会报错。推荐如下改动:
@set @x=1 /* &@ech ...

谢谢 我再试一试

点评

我这里测试了一下,也OK。不错 批处理用到了VBS,PE需要支持VBS才行  详情 回复 发表于 4 天前
回复

使用道具 举报

26#
发表于 4 天前 | 只看该作者
hua_wuxin 发表于 2025-2-18 08:22
if not defined v (exit/b) else (set "q=0" &set v=%v:"=%)
dir /ad %1 >nul 2>&1
if %errorlevel% equ  ...

看来是 目录的判断方式上有点问题,遇到X盘时
if exsit  "PATH"\
回复

使用道具 举报

27#
发表于 4 天前 | 只看该作者


我这里测试了一下,也OK。不错

批处理用到了VBS,PE需要支持VBS才行
回复

使用道具 举报

28#
发表于 4 天前 | 只看该作者
楼主还没回答我的问题:这用来干嘛呢?

点评

快捷方式放到 “发送到”,我喜欢自动:字节、KB、MB、GB ... ...,还能自定义小数点位数  详情 回复 发表于 4 天前
回复

使用道具 举报

29#
 楼主| 发表于 4 天前 | 只看该作者
martin313 发表于 2025-2-18 12:36
楼主还没回答我的问题:这用来干嘛呢?

快捷方式放到 “发送到”,我喜欢自动:字节、KB、MB、GB ... ...,还能自定义小数点位数
回复

使用道具 举报

30#
发表于 4 天前 | 只看该作者
本帖最后由 ppll2030 于 2025-2-18 12:48 编辑

哎呀。来晚了。
看koko的pe写着支持vbs,用VBS写了一个,也发上来留个记录吧

  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. obj = WScript.Arguments(0)

  3. If fso.FileExists(obj) Then
  4.     fileSize = fso.GetFile(obj).Size
  5.     fileConvertSize = ConvertSize(fileSize)
  6.     WScript.Echo "文件大小: " & fileConvertSize
  7. Else
  8.     folderSize = GetFolderSize(obj)
  9.     folderConvertSize = ConvertSize(folderSize)
  10.     WScript.Echo "文件夹大小: " & folderConvertSize
  11. End If

  12. Function GetFolderSize(folderPath)
  13.     totalSize = 0
  14.     Set folder = fso.GetFolder(folderPath)
  15.     For Each subFolder In folder.SubFolders
  16.         totalSize = totalSize + GetFolderSize(subFolder.Path)
  17.     Next
  18.     For Each file In folder.Files
  19.         totalSize = totalSize + file.Size
  20.     Next
  21.     GetFolderSize = totalSize
  22. End Function

  23. Function ConvertSize(Size)
  24. units = Array("字节", "KB", "MB", "GB", "TB", "PB", "EB")
  25. i = 0
  26. While Size >= 1024 And i < UBound(units)
  27.     Size = Size / 1024
  28.     i = i + 1
  29. Wend
  30. ConvertSize = Round(Size, 2) & " " & units(i)
  31. End Function
复制代码


点评

PE支持vbs,还是很容易实现的  发表于 4 天前
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-2-22 13:23

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表