2012-12-28 35 views
2

我想做一個簡單的統計程序,它只是計算它被運行了多少次。當我將跟蹤文件中的時間結果變量回顯到大於1時,會出現問題。是否無法將變量回顯到文件中?我錯過了什麼? :/將一個變量回顯到一個文件中

if not exist statistic_files (
mkdir statistic_files 
) 
cd statistic_files 

if exist %username%-use_tracking (
FOR /F %%G IN (%username%-use_tracking) DO set /A uses=%%G+1 
:: THE PROBLEM IS BELOW 
echo %uses% > %username%-use_tracking 
cd .. 
) 

if not exist %username%-use_tracking (
echo 1 > %username%-use_tracking 
cd .. 
) 

回答

2

當文件已經存在,因爲你設置一個變量的值,後來訪問同一個括號內的代碼塊中的值您的代碼失敗;當行被解析時,%uses%被展開,並且整個代碼塊被一次解析。所以你回顯的值是FOR循環執行之前的值 - 不是你想要的。

您可以通過使用setlocal enableDelayedExpansion啓用延遲擴展,然後使用!uses!而不是%uses%來解決問題。從命令提示符輸入help set以獲取更多信息。開始閱讀以開頭的段落「最後,增加了對延遲環境變量擴展的支持......」大約在幫助的中途。

但是有一種更簡單的方法可以避免延遲擴展的需要。您只需要設置IF塊內的值。您可以稍後在IF塊之外訪問它。

還有就是你正在避免另外一個問題,但你應該知道的:1>filename>filename做同樣的事情 - 他們是重定向標準輸出(stdout)到一個文件中的指令。 1是stdout的id,當數字沒有明確給出時,它是默認值。 2>filename將標準錯誤(stderr)重定向到文件。您避免將數字解釋爲流ID,因爲您的號碼和>之間有空格。但如果你不小心,你將有一天沒有空間,並且爲什麼這個號碼不打印而感到困惑。您可以通過將重定向放在前面而不是末尾來避免此問題。 >filename echo %uses%

因此,這是一個完整的工作解決方案。

@echo off 
setlocal 
if not exist statistic_files mkdir statistic_files 
cd statistic_files 
set "file=%username%-use_tracking" 

set "uses=1" 
if exist %file% for /f %%G IN (%file%) do set /A uses=%%G+1 
>%file% echo %uses% 
0

您使用單>

即:echo "Bla" > file.xyz

>只是覆蓋文件

什麼都嘗試>>

echo "Blabla" >> file.xyz 

>>只是通過去除創建該文件夾,以便它輸出到我的當前目錄下的頂部塊,兩個cd ..線,並在加入set username=ken在文件

1

測試當前的文件(年底追加內容頂部)產生:

  • 正確的內容(與1單行)第一次。
  • 第二次使用單行ECHO is on的文件。
  • 第三次出現錯誤消息。

由於ECHO打開,第二次運行是ECHO,因此第二次運行批處理文件時,您將獲得該輸出。

您需要關閉批處理文件頂部的echo。 (這並不妨礙使用echo命令;它只是防止您的批處理文件本身被輸出)

這對我的作品(使我在上面提到的更改):

@echo off 
set username=ken 

if exist %username%-use_tracking (
FOR /F %%G IN (%username%-use_tracking) DO set /A uses=%%G+1 
:: THE PROBLEM IS BELOW 
echo %uses% > %username%-use_tracking 
) 

if not exist %username%-use_tracking (
echo 1 > %username%-use_tracking 
) 

的結果:

  • 正確的內容(具有1一行)的第一次。
  • 第二次使用單行2的文件。
  • 第三次使用單行3的文件。 (如此反覆與更多的運行。)

如果你希望保持文件中的每一行,改變第一echo %uses% > %username%-use_trackingecho %uses% > %username%-use_tracking(注意雙>>)來代替。一個>表示覆蓋,兩個表示附加到當前內容的末尾。

1

您的問題與Delayed variable Expansion直接相關。爲了解決這個問題,在程序的beginnng插入此行:

setlocal EnableDelayedExpansion 

和包圍可變被修改的IF塊內側感嘆號代替百分比:

echo !uses! > %username%-use_tracking 

對於進一步的細節,在本論壇尋求「延期擴張」還有的話題很多答案,像這樣的:

Set the variable to another variable in the for statement

0
  1. 使用>>而不是>的重定向(追加模式)。
  2. 如果要更改兩者之間的目錄,請將絕對路徑用於日誌文件,而不是相對路徑。
0

好吧,我已經意識到,對於命令以一種奇怪的方式影響變量,我不得不使用延遲擴展。感謝大家說出這些。我已經設法使它正常工作,完全如何我想要它,它在這裏:

@echo off 
setlocal EnableDelayedExpansion 

if not exist statistic_files (
mkdir statistic_files 
cd statistic_files 
goto skip 
) 
cd statistic_files 
:skip 
set "file=%username%-use_tracking" 
set "uses=1" 

if not exist %file% (
>%file% echo 1 
cd .. 
) 
if exist %file% (
for /f %%G IN (%file%) do set /A uses=%%G+1 
>%file% echo !uses! 
cd .. 
) 
相關問題