2017-07-17 17 views
2

我有一個腳本試圖通過標題查找重複的視頻。我有一個從文件名外推的標題,我試圖尋找使用?通配符的關鍵字之間具有相同名稱的開頭其他文件:批量:問號通配符不能使用點

for /r %%i in ("%string%*") do set /a count+=1

其中%stringThe?Title?S01E01的格式,所以我搜索與"The?Title?S01E01*"這適用於當單詞與空格等分開,但分隔符是點時失敗。我如何克服這一點?我必須在我所做的每個腳本中爲此添加單獨的處理程序。

+0

文件名中的最後一個點將基本名稱與擴展名分開。你的名字中是否有文件擴展名?也許你需要'The Title?S01E01 *。*'... – aschipfl

+0

是的,有幾種不同的擴展可能性。我試過這個'標題?S01E01 *。*'方法,但沒有得到更好的結果(仍然沒有)。 – bricktop

回答

2

似乎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*" 
+0

這是非常奇怪的如何對待通配符不同於我知道的每一個其他標準Windows命令。 – dbenham

+0

是的,@dbenham; 'where','replace'和'forfiles'的行爲類似(至少在這個線程中的例子);對於手頭的例子,「robocopy」似乎表現得類似於內部命令;這真的很讓人困惑。一旦我找到時間,我會對通配符進行廣泛的測試...... – aschipfl

3

您的理解?是錯誤的。它不匹配任何單個字符。相反,它匹配除.以外的任何字符。如果沒有匹配的字符(在名稱末尾或.之前),那麼?將匹配「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