2016-04-10 86 views
0

我正在嘗試編寫一個簡單的批處理文件,該文件允許我比較兩個文件大小,其中這兩個文件名都是已知的,並且在批處理文件中設置。在文件名已知的批處理文件中獲取文件大小

但是隻是獲得一個文件大小是困難的。下面是複製問題的代碼最小的一塊:

IF EXIST "flava.jpg" (

    REM Get current filesize 
    FOR /F %%A in ("flava.jpg") DO SET _existingFileSize=%%~zA 

    ECHO %_existingFileSize% 

) ELSE (

    ECHO File not found. 

) 

從我讀過here,應該呼應變量的內容。這是怎麼回事?

+0

請在上下文中顯示代碼。我相信你可能在'代碼塊'(一個括號內的一系列語句)中有'for'和後面的'echo' - 請編輯你的問題以包含整個代碼塊(從初始化的'for'或' if'to finl closing')' – Magoo

+0

@Magoo我已經放棄了仍然複製我遇到的問題的最小代碼,而不是壓倒一切。 (在我的機器上測試過,仍然有相同的問題。) –

回答

3
setlocal enabledelayedexpansion 
IF EXIST "flava.jpg" (
    REM Get current filesize 
    FOR /F %%A in ("flava.jpg") DO SET _existingFileSize=%%~zA 
    ECHO !_existingFileSize! 
) ELSE (
    ECHO File not found. 
) 

IF EXIST "flava.jpg" (
    REM Get current filesize 
    FOR /F %%A in ("flava.jpg") DO SET _existingFileSize=%%~zA 
    CALL ECHO %%_existingFileSize%% 
) ELSE (
    ECHO File not found. 
) 

set "_existingfilesize=" 
FOR /F %%A in ("flava.jpg") DO SET _existingFileSize=%%~zA 
if defined _existingfilesize (echo %_existingfilesize%) else (echo file not found) 

的問題是,一個塊語句(a parenthesised series of statements),內整個塊進行解析,並然後執行。該塊內的任何%var%將在該塊被解析時由該變量的值取代 - 在塊執行之前 - 同樣的事情適用於FOR ... DO (block)

因此,在遇到IF時,將使用%variables%的值執行IF (something) else (somethingelse)。克服這個

兩種常用方法是:1)使用setlocal enabledelayedexpansion並使用!var!代替%var%訪問的var改變的值或2),以調用一個子程序使用改變的值來執行進一步的處理。

因此請注意使用CALL ECHO %%var%%,它顯示var的更改值。 CALL ECHO %%errorlevel%%顯示,但遺憾的是,然後RESETS錯誤級別。

+0

奇妙的教育答案!我自己解決這個問題的足夠信息。非常感謝! –

0

試試這個來打印一個或多個文件的文件大小。我製作了一個子程序使得編寫複雜的代碼塊變得更容易。如果您需要兩個命名文件,請使用確切的文件值。

@echo off 
set file=*.bat 
for %%A in (%file%) do call :DOIT %%A 
goto :END 

:DOIT 
echo %1 size is %~z1 
goto :EOF 

:END 
pause 
+0

子程序不需要。您可以改爲'%%〜zA'。 – Joey

+0

@Joey你能解釋一下嗎?謝謝。我真的不能看到我的代碼有什麼問題:( –

相關問題