2017-07-11 37 views
1

我有一個.bat文件,它會詢問您的姓名並將其保存在.txt文件中。如果該文件已經存在,我希望它說:「你的名字是____」錯誤寫入.bat文件中的文件

@echo off 
if exist BatchfileOutput.txt (
cls 
FOR /F %%i IN (BatchfileOutput.txt) DO echo Your name is %%i 

) else (
echo What is your name? 
set /p %name%=) 
echo %name% > BatchfileOutput.txt 

pause 

它打印ECHO處於關閉狀態,可能是由於在頂部@迴響。如果我手動向文件添加文本,它會顯示文本。有誰能幫我解決這個問題嗎?

+1

可能重複的[Windows批處理變量不會設置](https://stackoverflow.com/questions/9681863/windows-batch-variables-wont-set) – SomethingDark

回答

0
  1. set /P name=但不set /P %name%=

  2. 命令echo %name%也需要移動到else塊中。對於這項工作,delayed expansion必須建立:

    @echo off 
    if exist "BatchfileOutput.txt" (
        cls 
        for /F "usebackq tokens=*" %%i in ("BatchfileOutput.txt") do echo Your name is %%i 
    ) else (
        echo What is your name? 
        set /P name= 
        setlocal EnableDelayedExpansion 
        > "BatchfileOutput.txt" echo !name! 
        endlocal 
    ) 
    pause 
    

    我爲了避免拖尾SPACE要輸出也感動了redirection部分前面。

    爲了避免延遲擴展,則可以通過使用goto :Label作爲if塊的最後命令,則省略else和括號,然後放置避免parenthesised else:Label之前pause

    @echo off 
    if exist "BatchfileOutput.txt" (
        cls 
        for /F "usebackq tokens=*" %%i in ("BatchfileOutput.txt") do echo Your name is %%i 
        goto :Label 
    ) 
    echo What is your name? 
    set /P name= 
    > "BatchfileOutput.txt" echo %name% 
    :Label 
    pause 
    

我引用了所有文件路徑,因此使用for /Fusebackq選項以避免包含空格的字符串出現問題。此外,我指出for /F循環的tokens=*選項即使在名稱由多個單詞組成的情況下也能讀完全行。

1

你需要

set /p name= 

set /p %name%= 

這將設置變量命名名的當前內容