我有一個腳本試圖通過標題查找重複的視頻。我有一個從文件名外推的標題,我試圖尋找使用?
通配符的關鍵字之間具有相同名稱的開頭其他文件:批量:問號通配符不能使用點
for /r %%i in ("%string%*") do set /a count+=1
其中%string
有The?Title?S01E01
的格式,所以我搜索與"The?Title?S01E01*"
這適用於當單詞與空格等分開,但分隔符是點時失敗。我如何克服這一點?我必須在我所做的每個腳本中爲此添加單獨的處理程序。
我有一個腳本試圖通過標題查找重複的視頻。我有一個從文件名外推的標題,我試圖尋找使用?
通配符的關鍵字之間具有相同名稱的開頭其他文件:批量:問號通配符不能使用點
for /r %%i in ("%string%*") do set /a count+=1
其中%string
有The?Title?S01E01
的格式,所以我搜索與"The?Title?S01E01*"
這適用於當單詞與空格等分開,但分隔符是點時失敗。我如何克服這一點?我必須在我所做的每個腳本中爲此添加單獨的處理程序。
似乎for
(像dir
或其它內部命令太)因週期.
,因爲它表示從基本名稱的文件擴展名的分隔符混淆。
有外部命令where
(因爲Windows Vista中,我認爲),它確實喜歡?
和*
略有不同處理的野生卡,這似乎是適合你的任務:
for /F "delims=" %%i in ('where /R "." "The?Title?S01E01*"') do set /A "count+=1"
在上面的代碼中,where
正在生成當前目錄和下面的匹配文件列表,然後通過for /F
loop捕獲並解析該列表以使變量%%i
中的每個項目都可用。
爲了防止where
顯示的情況下,沒有文件被發現的錯誤消息,這樣做:
for /F "delims=" %%i in ('where /R "." "The?Title?S01E01*" 2^> nul') do set /A "count+=1"
注逃脫重定向^>
,這是必要的不被嘗試對for /F
執行。
如果您想尋找當前目錄只,而不是整個樹匹配的文件,在命令行中改變這個(注意前綴.:
):
where ".:The?Title?S01E01*"
您的理解?
是錯誤的。它不匹配任何單個字符。相反,它匹配除.
以外的任何字符。如果沒有匹配的字符(在名稱末尾或.
之前),那麼?
將匹配「Nothing」而不失敗。
我在SuperUser上的How does the Windows RENAME command interpret wildcards?上描述了這種行爲。
此行爲對於幾乎所有Windows標準命令都是一致的。但至少有一個例外,where
命令,如pointed out by aschipfl。他的where
解決方案可能是解決您的問題的最簡單方法。
一個更復雜的選擇是使用FINDSTR和適當的派生正則表達式來優化結果。最初的FOR搜索將在字符串中爲全部?
代替*
。
set "string2=%string:.=\.%"
set "string2=%string2:?=.%"
set "string2=%string2:*=.*%"
set "string2=%string2:^=\^%"
set "string2=%string2:$=\$%"
for /r %%i in ("%string:?=*%*") do echo %%~nxi|findstr /ric:"^%string2%" >nul && set /a count+=1
文件名中的最後一個點將基本名稱與擴展名分開。你的名字中是否有文件擴展名?也許你需要'The Title?S01E01 *。*'... – aschipfl
是的,有幾種不同的擴展可能性。我試過這個'標題?S01E01 *。*'方法,但沒有得到更好的結果(仍然沒有)。 – bricktop