Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何将此原始字节输出转换为GB?_Batch File - Fatal编程技术网

Batch file 如何将此原始字节输出转换为GB?

Batch file 如何将此原始字节输出转换为GB?,batch-file,Batch File,我使用下面的代码输出C:驱动器上当前的可用空间。如何使用批处理将输出从字节转换为GB @echo off for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) do set FreeSpace=%%x echo %FreeSpace% 批处理不支持浮点运算。这将是一个很好的解决方法: @setlocal ena

我使用下面的代码输出C:驱动器上当前的可用空间。如何使用批处理将输出从字节转换为GB

@echo off
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get       FreeSpace /format:value`) do set FreeSpace=%%x
echo %FreeSpace%

批处理不支持浮点运算。这将是一个很好的解决方法:

@setlocal enableextensions enabledelayedexpansion
@echo off

for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get       FreeSpace /format:value`) do set FreeSpace=%%x

echo !FreeSpace:~0,-10!,!FreeSpace:~2,-8!GB
只有当您以管理员身份运行.bat时,它才起作用。它只是在9后面插入一个点。从右边开始,并修剪最后7位。这与windows中的值不完全匹配,因为1k在这里是1000,而不是1024


一个更好但更复杂的解决方案是使用VBScript,如下文所述:

这里有一个以整数表示GB的解决方案。可能不是你想要的,但它很容易做到,并且可能会为你需要的做一些事情。我无法使用wmic让它真正为我工作,但wmic可能比dir更好

@setlocal enableextensions enabledelayedexpansion
@echo off
for /f "tokens=3" %%a in ('dir c:\') do (
    set bytesfree=%%a
)
set bytesfree=%bytesfree:,=%
endlocal && set bytesfree=%bytesfree%

rem truncating end. loses precision
set /a kb=%bytesfree:~0,-3%
set /a mb = kb/1024
set /a gb = mb/1024
echo %gb%
呃,好吧,使用wmic也是一样的

@setlocal enableextensions enabledelayedexpansion
@echo off
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get       FreeSpace /format:value`) do set FreeSpace=%%x

rem truncating end. losing precision
set /a kb=%FreeSpace:~0,-4%
set /a mb = kb/1024
set /a gb = mb/1024
echo %gb%

必须使用批处理命令吗?你不能使用PowerShell吗

[System.IO.DriveInfo]::GetDrives() | Where {$_.Name -eq 'C:\'} |
Select {$_.AvailableFreeSpace/1GB}

REM ECHO磁盘存储
对于/f“令牌=1”%%d(
'wmic logicaldisk其中drivetype^=3 get deviceid^| find:“')do(
对于(`wmic logicaldisk where“DeviceID='%%d'”获取大小/值`)中的/f“usebackq delims==tokens=2”%%x,请设置大小=%%x
%%d分区上的回显卷大小=!大小:~0,-10!,!大小:~2,-8!GB>output.txt
对于(`wmic logicaldisk where“DeviceID='%%d''get FreeSpace/value`)中的/f“usebackq delims==tokens=2”%%x,请设置FreeSpace=%%x
在%%d分区上回显自由空间=!自由空间:~0,-10!,!自由空间:~2,-8!GB>>output.txt
回声。
)
)
可以使用将长整数转换为人类可读的大小。这将导致比截断更精确的值,以满足
cmd
环境的32位限制。此API函数支持字节和千字节到PB和EB之间的值

(此脚本是一个混合批处理+PowerShell脚本。请使用扩展名.bat保存它。)


添加类型@'
使用System.Runtime.InteropServices;
命名空间shlwapi{
公共静态类dll{
[DllImport(“shlwapi.dll”)]
公共静态外部长StrFormatByteSize64(ulong fileSize,
System.Text.StringBuilder缓冲区,int bufferSize);
}
}
'@
$sb=新对象文本。StringBuilder 16
[void][shlwapi.dll]::StrFormatByteSize64($env:num,$sb,16)
$sb.ToString()

由于某种原因无法工作。我明白了,批处理不支持浮点运算。这可能是一个解决办法,只修剪最后9位数字。。。这里描述了另一种可能但更复杂的解决方案: