如何設定變數、表達式的結果

如何設定變數、表達式的結果

我需要提取文件的日期,然後使用該字串作為新文件名稱的一部分。我嘗試使用以下命令解決此問題:

首先,我獲取文件的詳細資訊並將輸出重定向到臨時文件。

DIR c:/myfolder/thefile.txt >> tmp.txt

然後我使用 FINDSTR 來取得包含日期的行,如果存在一種方法來只取得我沒有找到它的日期:

FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt

輸出是:

10/04/2012 07:55 66,029 thefile.txt

現在我想將此結果設為變數:

SET vartmp=FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt

看起來它有效,因為當我輸入 %vartmp% 時返回結果:

10/04/2012 07:55 66,029 thefile.txt

但是當我嘗試提取 vartmp 的一部分時,出現了問題:

ECHO %vartmp:~0,2%

當我期望“10”時,它返回字串“FI”,似乎vartmp正在保存表達式而不是表達式的結果,我正在嘗試將表達式的結果分配給另一個臨時變量,然後提取子字串tempvar但沒有任何改變。

答案1

FOR 指令可用於將一行切成標記,這樣您就可以只取得您想要的部分。使用 /f,您可以在其他命令的輸出上執行它,在本例中是使用 FIND 過濾的 DIR 輸出。

for /f "tokens=1" %%a in ('dir thefile.txt ^| Find "thefile.txt"') do (
set vartmp=%%a
)

答案2

這並不理想,但可以SET vartmp=FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt改為

FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt > tmp2.txt
SET /p vartmp =< tmp2.txt
DEL tmp2.txt

答案3

在遵循您的範例時,我發現了相同的結果,但是如果我替換了該行:

SET vartmp=FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt

for /f %i in ('FINDSTR [0-9]*\/[0-9]*\/[0-9] tmp.txt') do set vartmp=%i

然後 vartmp 儲存你想要的東西。請注意,您需要單引號,雙引號不起作用。另外,如果在批次文件中使用,則需要 %%i 代替 %i

相關內容