我有下面的腳本,我在特定的目錄中循環txt文件,我想只執行任何txt文件返回時循環內部的內容。 我試過使用IF NEQ
,但仍然輸入循環,雖然在這個位置沒有txt文件。檢查是否爲循環返回值批處理文件
@ECHO OFF
FOR %%I in (%cd%\txt\*.txt) DO (
SET namepath=%%I
echo(%namepath%)
IF [%namepath%] NEQ [""] (
echo entered
)
)
我有下面的腳本,我在特定的目錄中循環txt文件,我想只執行任何txt文件返回時循環內部的內容。 我試過使用IF NEQ
,但仍然輸入循環,雖然在這個位置沒有txt文件。檢查是否爲循環返回值批處理文件
@ECHO OFF
FOR %%I in (%cd%\txt\*.txt) DO (
SET namepath=%%I
echo(%namepath%)
IF [%namepath%] NEQ [""] (
echo entered
)
)
@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
,與前插入一個額外的空間(
(如echo
和echo(
在幾乎相同的方式被解釋),最後,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
設置爲%%I
和for
循環正在篩選.txt
文件 - 所以這應該將folder
設置爲僅%%I
或%%~nI
的名稱部分。
而且你應該能夠
md "%%~nI" 2>nul
這避免了與folder
完全整個體操鍛鍊; Tibial。
感謝這個有用的答案。還有一件事,如果我運行我的腳本在這裏http://pasteall.org/348561我得到這個錯誤'命令的語法是不正確的.'調試後,我發現它來自這一行'如果不存在%文件夾% md%folder%'不知道爲什麼?我已經嘗試使用mkdir,但也給出了相同的錯誤。 – Tak
始終「引用文件名和目錄名」,以便如果它們包含分隔符,則整個名稱將被解釋爲單個標記。不需要檢查目錄是否存在。只是'md「directoryname」',如果錯誤消息困擾你,'md「directoryname」2> nul',其中'2>'將錯誤消息重定向到*無處* – Magoo
我試過這個腳本http://pasteall.org/348649但由於某種原因,雖然'CALL ECHO(%%文件夾%% ^)'打印了正確的新文件夾路徑,但是沒有創建該文件夾,有什麼想法? – Tak
你需要[延期擴展](https://ss64.com/nt/delayedexpansion.html) – npocmaka
@npocmaka我在開始時增加了'SETLOCAL EnableDelayedExpansion',但仍然輸入循環,雖然沒有.txt文件這個目錄 – Tak
你想讀取文本文件嗎? – npocmaka