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 Bat文件以MB而不是字节显示结果文件大小_Batch File - Fatal编程技术网

Batch file Bat文件以MB而不是字节显示结果文件大小

Batch file Bat文件以MB而不是字节显示结果文件大小,batch-file,Batch File,您好,我正在尝试找出如何让我的结果以MB显示,这样它的可读性就比字节更高。此脚本用于监视服务器列表中的公用文件夹 谢谢你提供的任何帮助。我在谷歌上搜索了很长一段时间,但我自己却没能找到答案 ECHO DATE: %DATE% > filecount.TXT ECHO TIME: %TIME% >> filecount.TXT ECHO USER: %USERNAME% >> filecount.TXT ECHO COMPUTER: %COMP

您好,我正在尝试找出如何让我的结果以MB显示,这样它的可读性就比字节更高。此脚本用于监视服务器列表中的公用文件夹

谢谢你提供的任何帮助。我在谷歌上搜索了很长一段时间,但我自己却没能找到答案

ECHO     DATE: %DATE% > filecount.TXT
ECHO     TIME: %TIME% >> filecount.TXT
ECHO     USER: %USERNAME% >> filecount.TXT
ECHO COMPUTER: %COMPUTERNAME% >> filecount.TXT
ECHO. >> filecount.TXT
ECHO. >> filecount.TXT
ECHO. >> filecount.TXT
FOR /F "tokens=1" %%i in (servers.txt) DO (
 ECHO   %%i  ::: >> filecount.TXT 
 ECHO Counting %%i
 dir \\%%i\c$\folder1\folder2  | findstr "File(s)"  >> filecount.TXT 

 ECHO. >> filecount.TXT  
 ECHO. >> filecount.TXT  
)

:::::::::::::::::::::::: END SCRIPT :::::::::::::::::::::::::

SET
命令无法进行浮点运算,因此这在技术上是一种估计。此外,您还被限制为32位整数。因此,可以计算的最大字节大小是2147483647

@echo off
ECHO     DATE: %DATE% > filecount.TXT
ECHO     TIME: %TIME% >> filecount.TXT
ECHO     USER: %USERNAME% >> filecount.TXT
ECHO COMPUTER: %COMPUTERNAME% >> filecount.TXT
ECHO. >> filecount.TXT
ECHO. >> filecount.TXT
ECHO. >> filecount.TXT
FOR /F "tokens=1" %%i in (servers.txt) DO (
    ECHO   %%i  ::: >> filecount.TXT 
    ECHO Counting %%i
    FOR /F "tokens=1-4 delims= " %%G IN ('dir /-C \\%%i\c$\folder1\folder2 ^| findstr "File(s)"') DO (
        set size=%%I
        set bytes=%%J
        setlocal enabledelayedexpansion
        IF !size! GEQ 1048576 (
            set /a size/=1048576
            set bytes=MB
        )
        echo %%G %%H     !SIZE! !bytes! >> filecount.TXT  
        endlocal
    )
    ECHO. >> filecount.TXT  
    ECHO. >> filecount.TXT  
)
pause
:::::::::::::::::::::::: END SCRIPT :::::::::::::::::::::::::

下面是一个批处理函数,它将整数转换为人类可读的B/KB/MB/GB约定。它使用位于最高有效位右侧一位的位掩码来检查最终值是否应向上舍入。将其放在脚本底部的最后一个
exit/b
goto:EOF
下方:

:人的大小
延迟扩展
设置“单位=B”
设置/a“掩码=512,汇总=0,大小=%~2”
对于%%I in(KB)do(
如果!大小!geq 1024(
设置“单位=%%I”
设置/a“汇总=大小和掩码,大小>>=10”
)
)
如果%roundup%gtr 0套/a“尺寸+=1”
endlocal&设置“%~1=%size%%unit%”并退出/b
用法示例:

呼叫:humansize human 1536
rem//%human%现在包含“2 KB”
电话:humansize Human1535
rem//%human%现在包含“1KB”
请注意,批处理数学仅限于32位有符号整数(2GB)。

批处理脚本按文件夹中文件的大小和数量获取总和 附件是一个批处理脚本方法,它将为您获取KB、MB和GB以及脚本中所需的所有其他详细信息。它将全部转到日志文件并被相应地追加,同时仍然在服务器的文件列表中迭代,以获取目录中文件的总数和计数


批处理脚本 在顶部设置
日志文件
服务器列表
变量。设置目录以从FOR循环中获取文件详细信息,该循环仍然作为参数传递,命令将其作为参数传递给执行计算的动态PowerShell脚本构建例程等

@ECHO ON

SET LogFile=filecount.TXT
SET ServerList=Servers.txt

ECHO.........................................>> "%LogFile%"
ECHO DATE: %DATE%             >> "%LogFile%"
ECHO TIME: %TIME%             >> "%LogFile%"
ECHO USER: %USERNAME%         >> "%LogFile%"
ECHO COMPUTER: %COMPUTERNAME% >> "%LogFile%"
ECHO.                         >> "%LogFile%"

FOR /F "TOKENS=1" %%i IN (%ServerList%) DO (
    ECHO ~~~Counting %%~i~~~             >> "%LogFile%"
    CALL :PowerShellBuild "\\%%~i\c$\folder1\folder2"
)
ECHO.........................................>> "%LogFile%" 
EXIT
GOTO EOF
:::::::::::::::::::::::: END OF SCRIPT STILL :::::::::::::::::::::::::

:PowerShellBuild
SET TmpPSScript=%Temp%\~tmpFileCalc.ps1
IF EXIST "%TmpPSScript%" DEL /Q /F "%TmpPSScript%"

ECHO $Folder  = "%~1"                >>"%TmpPSScript%"
ECHO $Files   = Get-ChildItem $folder>>"%TmpPSScript%"
ECHO $KBTotal = ($files ^| Measure-Object -Sum Length).Sum / 1kb >>"%TmpPSScript%"
ECHO $MBTotal = ($files ^| Measure-Object -Sum Length).Sum / 1mb >>"%TmpPSScript%"
ECHO $GBTotal = ($files ^| Measure-Object -Sum Length).Sum / 1gb >>"%TmpPSScript%"
ECHO $Count   = ($files ^| Measure-Object).count                 >>"%TmpPSScript%"

ECHO $KBTotal = [math]::Round($KBTotal, 2) >>"%TmpPSScript%"
ECHO $MBTotal = [math]::Round($MBTotal, 2) >>"%TmpPSScript%"
ECHO $GBTotal = [math]::Round($GBTotal, 2) >>"%TmpPSScript%"

ECHO ECHO "Count: $Count" ^| Out-File -encoding ascii -append "%LogFile%" >>"%TmpPSScript%"
ECHO ECHO "KB: $KBTotal" ^| Out-File -encoding ascii -append "%LogFile%"  >>"%TmpPSScript%"
ECHO ECHO "MB: $MBTotal" ^| Out-File -encoding ascii -append "%LogFile%"  >>"%TmpPSScript%"
ECHO ECHO "GB: $GBTotal" ^| Out-File -encoding ascii -append "%LogFile%"  >>"%TmpPSScript%"

:PowerShellExec
SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%TmpPSScript%'"
GOTO EOF

我的测试示例脚本

结果

........................................
DATE: Sat 03/11/2017             
TIME: 16:52:32.48             
USER: User         
COMPUTER: FBIPC

~~~Counting Clutter~~~             
Count: 15
KB: 2490.48
MB: 2.43
GB: 0
~~~Counting Photowork~~~             
Count: 7
KB: 372.88
MB: 0.36
GB: 0
........................................ 
本机PowerShell 使用本机PowerShell测试您系统上的语法,以确认它在PowerShell ISE应用程序的此级别上工作,但在Windows 10和PowerShell 5.0下的my上工作,在Windows 7和PowerShell 4.0下的my上工作


进一步资源

您可以方便高效地使用ROBOCOPY获取累积文件计数和文件大小。它将自动将大值转换为千字节、兆字节或千兆字节(或者可能是兆字节?)

我将代码放在它自己的子例程中,以获取文件计数和文件大小

我还简化了代码,将主要代码块放在括号中,只重定向一次——这样更容易编写,而且效率更高(更快)

我还添加了代码来翻译
t
g
m
k
,并将空格翻译成
TB
GB
MB
KB
,以及
B
。如果没有翻译,代码会更简单

我敢肯定,如果你的语言不是英语,代码将不得不更改

@echo off
setlocal

:: Initialize unit translation
for /f "eol== delims==" %%V in ('set unit_ 2^>nul') do set "%%V="
for %%A in ("t=TB" "g=GB" "m=MB" "k=KB") do set "unit_%%~A"

> filecount.TXT (
  echo     DATE: %DATE%
  echo     TIME: %TIME%
  echo     USER: %USERNAME%
  echo COMPUTER: %COMPUTERNAME%
  echo(
  echo(
  echo(
  for /f "tokens=1" %%S in (servers.txt) do (
    echo   %%S  :::
    echo Counting %%S
    call :printSize "\\%%S\c$\folder1\folder2"
    echo(
    echo(
  )
)
exit /b

:printSize %1
setlocal
for /f "tokens=1,3,4" %%A in (
  'robocopy %1 %1 /l /is /nfl /ndl /njh'
) do (
  setlocal enableDelayedExpansion
  if %%A == Files (
      set "files=                %%B"
  ) else if %%A == Bytes (
    set "bytes=        %%B"
    set "unit=!unit_%%C!"
    if not defined unit set "unit=B"
  )
)
echo %files:~-16% File(s)  %bytes:~-8% %unit%
exit /b

你可以看看这个答案==>这对我来说是最容易理解的,但对我来说不起作用,因为组合大小可以超过250Gb。它看起来是指向servers.txt文件,但没有记录任何内容。我们可以进一步讨论这个问题吗?@SamuelWillis会在你有机会的时候告诉我事情的进展情况,如果你在这方面仍然有问题的话……谢谢你的跟进@MagicallyDelicous,我最终使用了dbenham代码,因为它运行得更快,我更喜欢记录结果。我测试了你的代码,它也能工作。再次感谢你们两位的帮助。@MagicallyDelicous-从功能上来说,这并不重要。但是当重定向带括号的块时,我更喜欢在块之前重定向,而不是在块之后重定向,因为我发现这样更容易理解-读者立即知道该块已重定向,而不是等待在块的末尾查找。@MagicallyDelicous-一旦块开始,任何不关闭
必须以
^的形式转义)
,或者像
“anything”)anything那样引用。在这种情况下,您可以通过将代码放在子例程中而不是放在括号中的块中,然后重定向
CALL:yourproutine>output.txt
这对我的意大利语版本不起作用。robocopy的输出依赖于语言:(@Einstein1969-这就是为什么最后一句话说“如果您的语言不是英语,我非常确定代码将不得不更改。”。我应该认为您可以将代码改编为其他语言。但我同意,语言依赖性远非理想。
@echo off
setlocal

:: Initialize unit translation
for /f "eol== delims==" %%V in ('set unit_ 2^>nul') do set "%%V="
for %%A in ("t=TB" "g=GB" "m=MB" "k=KB") do set "unit_%%~A"

> filecount.TXT (
  echo     DATE: %DATE%
  echo     TIME: %TIME%
  echo     USER: %USERNAME%
  echo COMPUTER: %COMPUTERNAME%
  echo(
  echo(
  echo(
  for /f "tokens=1" %%S in (servers.txt) do (
    echo   %%S  :::
    echo Counting %%S
    call :printSize "\\%%S\c$\folder1\folder2"
    echo(
    echo(
  )
)
exit /b

:printSize %1
setlocal
for /f "tokens=1,3,4" %%A in (
  'robocopy %1 %1 /l /is /nfl /ndl /njh'
) do (
  setlocal enableDelayedExpansion
  if %%A == Files (
      set "files=                %%B"
  ) else if %%A == Bytes (
    set "bytes=        %%B"
    set "unit=!unit_%%C!"
    if not defined unit set "unit=B"
  )
)
echo %files:~-16% File(s)  %bytes:~-8% %unit%
exit /b