无忧启动论坛

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

作者: yyz2191958    时间: 5 天前
标题: 悬赏500无忧币:解决PE下,用批处理“获取X盘的文件大小”出错的问题。谢谢
本帖最后由 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


作者: hua_wuxin    时间: 5 天前
本帖最后由 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:"=%)



作者: yyz2191958    时间: 5 天前
占楼备用
作者: martin313    时间: 5 天前
yyz2191958 发表于 2025-2-18 08:23
占楼备用


deepseek 都解决不了你这位批处理高手的问题?
作者: martin313    时间: 5 天前
yyz2191958 发表于 2025-2-18 08:23
占楼备用


这是要解决啥问题呢
作者: martin313    时间: 5 天前
yyz2191958 发表于 2025-2-18 08:23
占楼备用

@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
作者: martin313    时间: 5 天前
注意事项:

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

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

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

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

这个脚本结合了批处理的便捷性和PowerShell的强大计算能力,能够高效准确地处理各种大小的文件和文件夹。
作者: yyz2191958    时间: 5 天前
martin313 发表于 2025-2-18 09:00
@echo off
setlocal enabledelayedexpansion

'powershell' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'powershell' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
大小:
请按任意键继续. . .
作者: 忧心的启    时间: 5 天前
用个对比文件不行吗?
作者: martin313    时间: 5 天前
yyz2191958 发表于 2025-2-18 09:12
'powershell' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'powershell' 不是内部或外部命 ...

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

这个批处理,在正常系统下,也没出正确结果,需要继续调试
作者: yyz2191958    时间: 5 天前
忧心的启 发表于 2025-2-18 09:21
用个对比文件不行吗?

对比文件有什么用?
作者: martin313    时间: 5 天前

这个批处理中,@x=1 是干啥的?会不会这个影响到了X盘的路径问题
作者: yyz2191958    时间: 5 天前
martin313 发表于 2025-2-18 10:10
这个批处理中,@x=1 是干啥的?会不会这个影响到了X盘的路径问题

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

你说的是有可能的
作者: yyz2191958    时间: 5 天前
martin313 发表于 2025-2-18 10:10
这个批处理中,@x=1 是干啥的?会不会这个影响到了X盘的路径问题

将@x=1弄成@M=1,情况还是一样
作者: yyz2191958    时间: 5 天前
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  ...

我试一试先 谢谢
作者: yyz2191958    时间: 5 天前
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  ...

是完整代码吗?我拖到图标无显示
作者: martin313    时间: 5 天前
yyz2191958 发表于 2025-2-18 10:43
我试一试先 谢谢


这个批处理,牛逼啊
作者: martin313    时间: 5 天前
X盘的系统文件或文件夹,无法计算大小,我猜是因为PE运行情形下,批处理没权限的原因吧
作者: hua_wuxin    时间: 5 天前
yyz2191958 发表于 2025-2-18 10:49
是完整代码吗?我拖到图标无显示

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

作者: yyz2191958    时间: 5 天前
martin313 发表于 2025-2-18 10:55
X盘的系统文件或文件夹,无法计算大小,我猜是因为PE运行情形下,批处理没权限的原因吧

文件夹没有问题,就是文件不行
作者: yyz2191958    时间: 5 天前
hua_wuxin 发表于 2025-2-18 10:57
不是
红字是改动的地方 黑字是你原文识别改动的位置用

好像可以了,我慢慢认真测试先,非常感谢
作者: martin313    时间: 5 天前
yyz2191958 发表于 2025-2-18 11:07
好像可以了,我慢慢认真测试先,非常感谢

恭喜恭喜
作者: martin313    时间: 5 天前
yyz2191958 发表于 2025-2-18 11:07
好像可以了,我慢慢认真测试先,非常感谢


但不知道,这用来干嘛呢?
作者: hua_wuxin    时间: 5 天前
本帖最后由 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%

(以下未动,略)



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

谢谢 我再试一试
作者: baikunlun    时间: 5 天前
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"\
作者: martin313    时间: 5 天前
yyz2191958 发表于 2025-2-18 11:48
谢谢 我再试一试


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

批处理用到了VBS,PE需要支持VBS才行
作者: martin313    时间: 5 天前
楼主还没回答我的问题:这用来干嘛呢?
作者: yyz2191958    时间: 5 天前
martin313 发表于 2025-2-18 12:36
楼主还没回答我的问题:这用来干嘛呢?

快捷方式放到 “发送到”,我喜欢自动:字节、KB、MB、GB ... ...,还能自定义小数点位数
作者: ppll2030    时间: 5 天前
本帖最后由 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
复制代码



作者: martin313    时间: 5 天前
这个是deepseek修改的,也一样好用:

@set @x=1 /* &@echo off
set "v=%~1"
if not defined v exit /b
set "q=0"
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();

作者: martin313    时间: 5 天前
powershell 法:

@echo off
setlocal enabledelayedexpansion

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

:: 获取规范路径并验证存在性
set "item=%~f1"
if not exist "!item!" (
    echo 路径不存在: "!item!"
    pause
    exit /b
)

:: 特殊字符转义处理
set "safe_item=!item:'=''!"
set "safe_item=!safe_item:\=\\!"
set "safe_item=!safe_item:""=\"!"

:: 计算大小
set "size=0"
if exist "!item!\" (
    for /f "delims=" %%a in ('powershell -Command "$sum=0; $path='%safe_item%'; Get-ChildItem -LiteralPath $path -Recurse -File -ErrorAction SilentlyContinue -Force | %%{ $sum += $_.Length }; $sum" 2^>^&1') do (
        set "size=%%a"
    )
) else (
    for %%F in ("!item!") do set "size=%%~zF"
)

:: 错误捕获
if "!size!"=="" (
    echo 无法计算大小,请检查路径权限
    pause
    exit /b
)

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

:: 结果输出
echo.
echo.   大小: !value! !unit!
echo.
pause
作者: zyy    时间: 5 天前
PE 测试确实有用,但不明白这个有什么用?
此电脑 中右键“属性” 或 “鼠标”指针选择后就会出现文件大小;为什么还需要拖一下
作者: martin313    时间: 5 天前
zyy 发表于 2025-2-18 14:34
PE 测试确实有用,但不明白这个有什么用?
此电脑 中右键“属性” 或 “鼠标”指针选择后就会出现文件大小 ...


按楼主的意思是用发送到

但我也是不明白,这个有啥用
作者: yyz2191958    时间: 5 天前
zyy 发表于 2025-2-18 14:34
PE 测试确实有用,但不明白这个有什么用?
此电脑 中右键“属性” 或 “鼠标”指针选择后就会出现文件大小 ...

刚好3位数字的时候,没有小数点
作者: martin313    时间: 4 天前
无论是bat、vbs、powershell,实质上还是通过先获取文件或文件夹的属性,根据属性里显示的大小再转换输出的
作者: martin313    时间: 4 天前
yyz2191958 发表于 2025-2-18 17:31
刚好3位数字的时候,没有小数点

就是有无小数点,有啥用呢???
作者: andylxh    时间: 4 天前
更改路径x盘是你的pe
作者: yyz2191958    时间: 4 天前
martin313 发表于 2025-2-19 10:09
就是有无小数点,有啥用呢???

...

3.png (16.5 KB, 下载次数: 0)

3.png

作者: martin313    时间: 4 天前
yyz2191958 发表于 2025-2-19 11:01
...


就是这个干啥用?
作者: martin313    时间: 4 天前
yyz2191958 发表于 2025-2-19 11:01
...


这个属性要显示小数点位数,通过修改系统注册表,也是可以实现的
作者: yyz2191958    时间: 4 天前
martin313 发表于 2025-2-19 11:03
就是这个干啥用?

有一些时候,需要精确一些
作者: yyz2191958    时间: 4 天前
martin313 发表于 2025-2-19 11:04
这个属性要显示小数点位数,通过修改系统注册表,也是可以实现的

能不能给出代码?我需要
作者: yyz2191958    时间: 4 天前
martin313 发表于 2025-2-19 11:04
这个属性要显示小数点位数,通过修改系统注册表,也是可以实现的

我需要3位小数点
作者: martin313    时间: 4 天前
yyz2191958 发表于 2025-2-19 11:11
我需要3位小数点

问问deepseek :

如何通过修改注册表,在windows系统里实现查看文件夹或文件属性时,文件夹或文件大小显示小数点后3位数?
作者: martin313    时间: 4 天前
yyz2191958 发表于 2025-2-19 11:11
我需要3位小数点

要通过修改注册表在Windows中实现文件或文件夹大小显示小数点后三位数,可以尝试以下方法。但需注意,此操作可能影响系统中其他数字的显示格式,请谨慎操作并提前备份注册表。

步骤如下:
打开注册表编辑器
按下 Win + R,输入 regedit,回车并确认管理员权限。

导航至区域格式设置项
转到以下路径:

复制
HKEY_CURRENT_USER\Control Panel\International
修改小数位数键值

找到右侧的 iDigits 键值(控制小数位数)。

双击 iDigits,将其数值数据从默认的 2 改为 3(表示显示三位小数)。

如果不存在 iDigits,右键新建一个字符串值(REG_SZ)并命名为 iDigits,再设置值为 3。

重启资源管理器或系统

按 Ctrl + Shift + Esc 打开任务管理器,找到“Windows 资源管理器”,右键选择“重新启动”。

或直接重启电脑使设置生效。

验证效果
右键查看文件/文件夹属性,检查大小是否显示三位小数(如 1.234 MB)。

注意事项
全局影响:此修改会调整系统中所有依赖区域格式的数字显示,例如部分应用程序中的数字、货币等。

兼容性问题:并非所有Windows版本均支持此调整,部分系统可能忽略此设置或仅影响特定场景。

单位限制:文件资源管理器可能根据单位(KB/MB/GB)自动调整小数位数,例如在GB单位下默认显示更多小数位。

替代方案
如果上述方法无效或不愿影响其他数字格式,可考虑:

使用第三方工具
例如 Folder Size、TreeSize 等工具,支持自定义文件大小显示格式。

脚本或批处理
通过PowerShell脚本获取精确大小并格式化输出。

请确保理解风险后再操作,必要时创建系统还原点。
作者: yyz2191958    时间: 4 天前
martin313 发表于 2025-2-19 12:20
要通过修改注册表在Windows中实现文件或文件夹大小显示小数点后三位数,可以尝试以下方法。但需注意,此 ...

我试一试 谢谢
作者: yyz2191958    时间: 4 天前
martin313 发表于 2025-2-19 12:20
要通过修改注册表在Windows中实现文件或文件夹大小显示小数点后三位数,可以尝试以下方法。但需注意,此 ...

是呀,10 PE 没有效果哦
作者: zag0699    时间: 4 天前
以前xp 系统有个DLL, 显示文件夹大小 ,特别好用, win10没了
作者: martin313    时间: 4 天前
yyz2191958 发表于 2025-2-18 17:31
刚好3位数字的时候,没有小数点


VBS代码中,Fixed(2) 表示保留2位小数点;PowerShell代码中,{0:N2} 表示保留2位小数点。




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3