2011-01-11 75 views
1
set a=file 
if exist "folder\%a%" ( 
set /p x= < "folder\%a%" 
echo %x% 
) 

我已經寫批處理文件很長一段時間,但我不明白爲什麼這 代碼不起作用。我希望代碼回顯出 %a的內容。但所有這返回的是ECHO的狀態(回聲接通批量輸入重定向符

的%A%(文件),包含預計將呼應出一個字符串(「關鍵字」)時 集%X%

我甚至試圖把擴展名文件(.txt),但它仍然無法正常工作

回答

2

它不工作,因爲完整的括號塊(也呼應%X%)先於「設置評估/ p「將被執行,您可以更改爲延遲擴展。

​​

[編輯]

此代碼還接受感嘆號在文件名

set "a=folder\foo!bar.txt" 
SETLOCAL EnableDelayedExpansion 
if exist "!a!" (
    set /p x= < "!a!" 
    echo !x! 
) 
+0

請問你們延遲擴展是什麼意思? – kapitanluffy 2011-01-11 00:10:50

+0

如果%a%包含! (例如「foo!bar.txt」),那麼您的代碼會中斷 – Anders 2011-01-11 00:22:44

1
if exist "folder\%a%" ( 
set /p x=< "folder\%a%" 
SETLOCAL ENABLEDELAYEDEXPANSION&echo !x!&ENDLOCAL 
) 

這基本上是相同的代碼傑布,但ENABLEDELAYEDEXPANSION不會影響路徑,所以文件名與!將仍然有效(%可能無法正常工作,但這是批處理文件和文件名的一般問題)

set /p x= < .\somefile有點破解,您可能要考慮使用FOR /F "tokens=*" %%A ...但是FOR會讀取每行除非你在DO中放置一個if。所以,如果你只想要第一行,你最終會得到一些醜陋的東西:

set eof=0 
for /F "tokens=*" %%A IN ('type "folder\%a%" 2^>nul') DO (
    SETLOCAL ENABLEDELAYEDEXPANSION&(if "!eof!"=="0" (echo.%%A))&ENDLOCAL 
    set eof=1 
)