我正在嘗試進行批處理,它搜索包含 log4j-core 的所有檔案并將所有路徑存盤到文本檔案,以便我可以將具有不同版本的新更新檔案復制到找到的所有路徑。這就是我到目前為止所擁有的。
SetLocal EnableDelayedExpansion
cd \
ECHO SEARCHING FOR log4j-core THIS MAY TAKE SOME TIME...
dir /s /b log4j-core*.jar >%tmp%\path.txt
echo delims
for /f "delims=" %%a in (%tmp%\path.txt) do (set path=%%~dpa && copy /b /y "c:\Temp\Script\patch.jar" "%path%\log4j-core-2.17.2.jar")
pause
uj5u.com熱心網友回復:
盡管您實際上并沒有提出問題,但您的代碼存在問題。
%temp%默認情況下包含空格,因此您需要%tmp%\path.txt在使用它的任何地方參考,因此:"%tmp%\path.txt"
這意味著您需要"usebackq delims="在for /f其他情況下for分析字串 "%tmp%\path.txt",而不是按預期分析檔案。 "%tmp%\path.txt"
下一個問題是set陳述句。Batch 對普通字串SET陳述句中的空格很敏感。SET FLAG = N將名為“FLAG Space”的變數設定為值“ SpaceN”。用于set "var1=value"設定STRING值 - 這可以避免尾隨空格引起的問題。
不要path用作變數名 - 它是批處理的保留字,表示搜索目錄以查找不在當前目錄中的可執行檔案的順序。
接下來是小事delayedexpansion。您正在呼叫delayedexpansion但未使用它。請閱讀Stephan 的 DELAYEDEXPANSION 鏈接
一旦我們解決了所有這些問題,我們就會進行簡化。
無論您使用什么變數名,%~dp?都會回傳包含終端反斜杠的路徑名,因此您無需在copy.
您不需要使用中間變數 - 僅當您正在操作字串時。"%%~dpaog4j-core-2.17.2.jar"將非常適合您的復制目標,記住%%~dpa它將被決議為帶有終端反斜杠的字串。
該echo陳述句將僅顯示字串delims并且似乎毫無意義。
這可能是學術性的,但是該dir命令應該包含/a-d排除任何與該模式匹配的目錄名稱,盡管這不太可能。
我還建議where /r \ log4j-core*.jar應該產生與命令相同的結果dir。請注意,有兩個引數where /r要匹配 - 目錄名稱和檔案名模式。如果檔案名模式沒有擴展名,則它需要一個終端,.否則.*假定。
最后,for /f可以處理命令產生的串列,for /?從提示或SO上的數千個示例中查看。
因此,總而言之,您的代碼可以簡化為
for /f "delims=" %%a in ('where /r \ log4j-core*.jar') do copy /b /y "c:\Temp\Script\patch.jar" "%%~dpalog4j-core-2.17.2.jar"
在應用于真實資料之前,請始終根據測驗目錄進行驗證。
簡單echo的copy驗證命令是明智的
我再說一遍,在應用到真實資料之前,一定要對照測驗目錄進行驗證。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/491636.html
上一篇:將區域變數用于“回傳”結果的函式
