簡體   English   中英

從另一個批處理中啟動時,批處理文件的行為有所不同

[英]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等語言不同。 批處理只是簡單地逐行執行,直到到達CALLGOTO EXIT或END-OF-FILE為止。 從功能或過程的意義上講,它沒有任何“塊”的概念。 標簽只是標記。

因此,

GOTO no

是多余的。 除非ANSWERyyes 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和-哦-哦-另一個陷阱可能更為重要。 datetime是所需變量的邏輯名稱。 問題是,它們太合邏輯了。 它們是magic variables -最好不要弄亂它們。

如果未設置任何magic variable則可以在批處理程序中將其設置為與普通變量BUT相同的設置,系統會將它們設置為-魔術值。 當然是靠魔術。 %date%包含日期, %time%包含時間-還有很多其他內容-請參閱SET /? 從提示列表中。

魔術變量的問題在於,它們不會出現在通過執行SET (沒有參數!)而獲得的系統初始化變量的列表中。更改這些變量也不是一個好主意。 批處理程序通常將采用其值。

目前,該系統初始化的變量之一是path -即獲得搜索以找到一個execuable如果沒有明確的路徑是由目錄的列表,它不是在當前目錄中。

關於%0\\..\\構造,最后一點很重要。 %0 ”本身就是批處理文件名。 它可能是fredfred.batC:\\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM