2017-04-12 92 views
0

我有下面的腳本,我在特定的目錄中循環txt文件,我想只執行任何txt文件返回時循環內部的內容。 我試過使用IF NEQ,但仍然輸入循環,雖然在這個位置沒有txt文件。檢查是否爲循環返回值批處理文件

@ECHO OFF 
FOR %%I in (%cd%\txt\*.txt) DO (
SET namepath=%%I 
echo(%namepath%) 
IF [%namepath%] NEQ [""] (
echo entered 
) 
) 
+1

你需要[延期擴展](https://ss64.com/nt/delayedexpansion.html) – npocmaka

+0

@npocmaka我在開始時增加了'SETLOCAL EnableDelayedExpansion',但仍然輸入循環,雖然沒有.txt文件這個目錄 – Tak

+0

你想讀取文本文件嗎? – npocmaka

回答

2
@ECHO OFF 
SETLOCAL 
FOR %%I in (%cd%\*.pzk) DO (
echo ++%%I++ 
SET namepath=%%I 
ECHO (%namepath%^) 
CALL ECHO (%%namepath%%^) 
IF [%namepath%] NEQ [""] (
echo entered 
) 
) 
GOTO :EOF 

不可思議的是,我沒有叫*.pzk目錄中的文件,所以這給跑了沒有結果。

我然後設置test.pzk和由此產生

++ C:\ 106X \ test.pzk ++
()
(C:\ 106X \ test.pzk)
輸入

因爲我回顯兩對+作爲哨兵的姓名,所以namepath的值與遇到for時的值相同(沒有),然後通過調用echo,與前插入一個額外的空間((如echoecho(在幾乎相同的方式被解釋),最後,entered因爲[]確實不等於[""]

所以 - 之一您的問題是echo (%namepath%)中的)被解釋爲在for...do (中關閉(。因此,entered將會是echo ed。

如果您的代碼爲if %var%==somevalue goto somewhere,那麼如果var爲空,則將解析爲if ==somevalue goto somewhere。 「引用參數」如此:if "%var%"=="somevalue" goto somewhere緩解了這種情況。 如果您的代碼爲if %var%==somevalue goto somewhere,那麼如果var爲空,則會解析爲if ==somevalue goto somewhere。 「引用參數」如此:if "%var%"=="somevalue" goto somewhere緩解了這種情況。要比較的字符串在所有方面必須相同才能聲明爲「相等」。


您的代碼:請不要鏈接到異地資源,因爲它們可能會蒸發]

@ECHO OFF 
SETLOCAL 
FOR %%I in (%cd%txt*.txt) DO (
SET namepath=%%I 
IF [%namepath%] NEQ [""] (
    SET name=%%~nxI 
    SET folder=%cd%txt%name% 
    CALL ECHO (%%folder%%^) 
    CALL ECHO (%%namepath%%^) 

    SET folder=%namepath:.trc=!""!% 
    call set folder=%%namepath:.txt=%% 
    CALL ECHO (%%folder%%^) 
    md "%folder%" 2>nul 
) 
) 
GOTO :EOF 

代碼塊(parenthesised系列命令)在分析時進行評估,此時任何%var%被這個變量的值代替。通過其在goto :eof之前匹配)整個程序DO (一個碼塊並首先遇到的for當此過程將被應用到該整個塊。

如果你想一個代碼塊中訪問變量的運行時值,你需要調用delayedexpansion [有數百篇關於這個SO項目]當%var%仍然意味着「分析時值「和!var!的意思是」運行時間值「,即。該值隨着它在循環中的變化而變化。

。注意,句法call echo/set...調用的子處理,其與當前環境的副本進行,因此具有運行時的主處理的值。所以call echo %%var%%實際執行一個子進程,並使用的事實,%%轉義字符的子過程,這是var呼叫ING過程中當前值執行指令echo %var%

FOR %%I in (%cd%txt*.txt) DO (

不確定你在這裏需要什麼。 %cd%不包括終端\,所以這將意味着「父目錄名稱txt * .txt」。我相信這可能是您使用的第三方網站創建的錯誤。這裏%cd%\.\相同,但在任何情況下都是冗餘的,因爲當前目錄是默認目錄。

IF [%namepath%] NEQ [""] (

總是將是真正的除非namepath包含在該for遇到時的值""(即兩隻兔子的耳朵)

由於namepath正在代碼塊內變化,你需要!namepath!這裏訪問的運行時間值,但它確實沒有必要,因爲namepath不能在這一點上是空的 - %%I將永遠是空的 - 整個如果沒有匹配的文件,則for代碼塊將被跳過。

但是 - 當我們穿過,語法if defined namepath將檢測namepath什麼(即清零) - if defined作品的變量運行時值。

SET folder=%namepath:.trc=!""!% 

我不知道你打算在這裏做什麼。它似乎要.trc!""! - 但我沒有概念爲什麼。兔子的耳朵不是有效的文件/目錄名字符,所以這似乎沒有意義。加入!delayedexpansion模式中的特殊字符,並且神祕程度加深。

無論如何,你用下一個語句覆蓋folder的值。

現在 - 該聲明應取代.txt沒有任何。公平的,但namepath設置爲%%Ifor循環正在篩選.txt文件 - 所以這應該將folder設置爲僅%%I%%~nI的名稱部分。

而且你應該能夠

md "%%~nI" 2>nul 

這避免了與folder完全整個體操鍛鍊; Tibial。

+0

感謝這個有用的答案。還有一件事,如果我運行我的腳本在這裏http://pasteall.org/348561我得到這個錯誤'命令的語法是不正確的.'調試後,我發現它來自這一行'如果不存在%文件夾% md%folder%'不知道爲什麼?我已經嘗試使用mkdir,但也給出了相同的錯誤。 – Tak

+1

始終「引用文件名和目錄名」,以便如果它們包含分隔符,則整個名稱將被解釋爲單個標記。不需要檢查目錄是否存在。只是'md「directoryname」',如果錯誤消息困擾你,'md「directoryname」2> nul',其中'2>'將錯誤消息重定向到*無處* – Magoo

+0

我試過這個腳本http://pasteall.org/348649但由於某種原因,雖然'CALL ECHO(%%文件夾%% ^)'打印了正確的新文件夾路徑,但是沒有創建該文件夾,有什麼想法? – Tak