[英]batch file acts differently when launched from within another batch
所以...嘿,伙計們 我有最奇怪的問題。 我寫了這個批處理文件,生成了一個文本文件
我的代碼,因為某些原因變得非常搞砸是波紋管,你可以看到一個更好的版本在這里
@ECHO OFF
IF NOT EXIST file.txt goto generate
ECHO Erase the file>%0\..\file.txt
:generate
ECHO.
ECHO.
ECHO generating Table file for you
ECHO Please enter a name:
SET /P name=
ECHO.
ECHO Please enter the date:
SET /P date=
ECHO.
ECHO Please enter the time:
SET /P time=
ECHO.
ECHO.
ECHO Huzzah!
ECHO |set /p =%name% %date% %time%>%0\..\file.txt
:repeat
ECHO Do you want to add another entry? (Y/N)
SET /P answer=
IF /i {%ANSWER%}=={y} (GOTO yes)
IF /i {%ANSWER%}=={yes} (GOTO yes)
GOTO no
:no EXIT /B
:yes
ECHO.
ECHO.
ECHO Please enter a name:
SET /P name=
ECHO.
ECHO Please enter the date:
SET /P date=
ECHO.
ECHO Please enter the time:
SET /P time=
ECHO.
ECHO.
ECHO Huzzah!
ECHO.>>file.txt
ECHO |set /p =%name% %date% %time%>>%0\..\file.txt
GOTO repeat
而且有效! 這是故障,我不想只運行此文件,我想從另一個文件中運行它。
Sooooo在我的另一個.bat中,我有這條線
@call %0\..\generate_file.bat
再次它很好用,調用它,運行它,如果我只有一個條目,那么一切都很好...但是,如果我輸入yes並進入另一個條目,它不會創建新行,它只會繼續附加新條目到舊條目上。 如果我只是自己啟動generate_file.bat,它將按預期工作。
有人有想法么?
ek! 請把我的大瓶阿司匹林交給我!
Ansgar似乎已對原始文件進行了編輯,以匹配pastebin版本-如果是正確的話,則該例程似乎無法工作-調用還是不執行...
這條線
:no EXIT /B
將無法正常工作。 標簽行上的所有數據都將被忽略,因此無法EXIT
該過程。 這MUST
寫成
:no
EXIT /B
下一個小問題是上一行。 與PASCAL或DELPHI等語言不同。 批處理只是簡單地逐行執行,直到到達CALL
, GOTO
EXIT
或END-OF-FILE為止。 從功能或過程的意義上講,它沒有任何“塊”的概念。 標簽只是標記。
因此,
GOTO no
是多余的。 除非ANSWER
是y
或yes
no
將到達標簽no-並且GOTO yes
周圍的括號也是多余的。
下一個小問題是響應SET/P
僅按ENTER
不會更改變量的值-它將保留set/p
之前的任何值。
結果是應該將answer
設置為y
,然后響應enter
將使answer
設置為y
它不會清除answer
。
解決此問題的方法是在執行set/p
之前專門設置值
SET "ANSWER="
SET /P ANSWER=
但是,這經常是兩條路。 如果您編碼
SET "ANSWER=Y"
SET /P ANSWER="[%ANSWER%] "
然后SET/P
將以[Y]
提示-注意,此處僅需使用引號將空格括起來。 不需要空間嗎? 省略引號...
現在,這對於輸入name
和-哦-哦-另一個陷阱可能更為重要。 date
和time
是所需變量的邏輯名稱。 問題是,它們太合邏輯了。 它們是magic variables
-最好不要弄亂它們。
如果未設置任何magic variable
則可以在批處理程序中將其設置為與普通變量BUT相同的設置,系統會將它們設置為-魔術值。 當然是靠魔術。 %date%
包含日期, %time%
包含時間-還有很多其他內容-請參閱SET /?
從提示列表中。
魔術變量的問題在於,它們不會出現在通過執行SET
(沒有參數!)而獲得的系統初始化變量的列表中。更改這些變量也不是一個好主意。 批處理程序通常將采用其值。
目前,該系統初始化的變量之一是path
-即獲得搜索以找到一個execuable如果沒有明確的路徑是由目錄的列表,它不是在當前目錄中。
關於%0\\..\\
構造,最后一點很重要。 “ %0
”本身就是批處理文件名。 它可能是fred
或fred.bat
或C:\\somewhere\\somewhereelse\\fred.bat
根據情況有很多不同的東西。 %0\\..\\file.txt
可能有所不同-當前目錄中的file.txt
最有可能。
因此-您的原始批處理將檢查file.txt
是否在當前目錄中存在,然后注釋Erase the file
到%0\\..\\file.txt
如果Erase the file
已經存在)-可能會寫入.\\file.txt
(即file.txt
當前目錄中的file.txt
)-因此它會覆蓋現有文件。
無論如何,例程隨后會詢問三個數據項並使用此特殊的構造
ECHO |set /p =%name% %date% %time%>%0\..\file.txt
它只是對變量沒有任何反應,而只是對指向該文件的數據行進行提示-創建新文件或覆蓋(再次)現有文件(單個>
表示“在新文件中”)
然后,提示您輸入另一個條目,這次是在文件中追加( >>
)。
如果deleted
任何現有文件,然后appended
所有數據行appended
到一個新文件,這將更加簡單- >>
將創建一個文件(如果尚不存在)。
所以-這是部分修訂。 我沒有刪除多余的括號和GOTO
,也沒有在SET /P
之前清除或預設數據值或將提示並入其中。 我什至沒有留下變量名。
請注意我如何設置filename
-設置一次,以便變量%filename%
可用於文件而不是不斷重復相同的字符串-如果您決定更改文件名會很麻煩...
@ECHO OFF
SET filename=%~dp0%file.txt
ECHO %filename%
IF NOT EXIST %filename% goto generate
ECHO Erase the file %filename%
DEL %filename%
:generate
ECHO.
ECHO.
ECHO generating Table file for you
:yes
ECHO Please enter a name:
SET /P name=
ECHO.
ECHO Please enter the date:
SET /P date=
ECHO.
ECHO Please enter the time:
SET /P time=
ECHO.
ECHO.
ECHO Huzzah!
ECHO(%name% %date% %time%>>%filename%
:repeat
ECHO Do you want to add another entry? (Y/N)
SET /P answer=
IF /i {%ANSWER%}=={y} (GOTO yes)
IF /i {%ANSWER%}=={yes} (GOTO yes)
GOTO no
:no
EXIT /B
希望你覺得這個有用! 我要躺下。
替換為:
ECHO |set /p =%name% %date% %time%>>%0\..\file.txt
有了這個:
>>"%~dp0\file.txt" echo %name% %date% %time%
%0
是腳本文件本身。 使用%~dp0\\file.txt
代替%0\\..\\file.txt
來訪問同一文件夾中的文件。 在雙引號之間放置路徑,以免由於意外的空格而引起意外。 並將重定向放在命令之前,以避免像您觀察到的那樣奇怪的輸出重定向問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.