2013-08-05 81 views
1

我需要將兩件東西寫入.bat文件中,我正在爲一個小項目工作。首先,我必須知道是否包含在同一個文件夾中的任何文件名(遞歸),我啓動我的.bat的長度超過100個字符。如果是這樣,我需要使它長92個字符並保留擴展名。從批處理文件中確定文件名長度

例如,我有該文件名:

IncrediblyLongFileNameIAmSorryForThisItLooksLikeSomeDamnSpamJesusIAintEvenCloseTo100yetalmostwaitforitYEAH.omg

上述文件名是110個字符。我需要保持的擴展,因此程序應將該文件重命名爲這樣:

IncrediblyLongFileNameIAmSorryForThisItLooksLikeSomeDamnSpamJesusIAintEvenCloseTo100yetalmos.omg

到目前爲止,我的主要問題是,我不知道如何在批文件名字符串的工作。我用這個代碼:

@echo off & setlocal enableextensions 
FOR /R %%i IN (*.*) DO (
ECHO %%~nxi 
FOR /f "delims=:" %%a in (' 
^(echo."%%~nxi"^& echo.^)^|findstr /o .' 
) DO set lenght=%%a-5 
echo The length of "%%~nxi" is %lenght% 
) 
endlocal & goto :EOF 

但我不能SET一個FOR裏面,它不能做基本的數學或者(即它不能做的-5操作)。

第二件事,我相信一旦完成第一件事就會容易一些,就是比較文件夾中的所有文件名(再次遞歸),並確保沒有文件名是相同的。如果程序找到任何相同的文件名,則應該重新命名第二次以在末尾添加類似l1l的內容。 (我不能在這裏使用小括號,因此我使用兩個l來代替這個數字。)唯一需要注意的是文件擴展名,因爲我無法在文件擴展名之後添加任何內容,以免它們變得無法使用。

任何人都可以提供解釋如何做到這一點?我真的希望能夠自己解決這個問題,但我只是缺乏批量編程的經驗。

+0

你應該把它分成兩個問題。 – Endoro

+0

要「做基礎數學」試一下'set /?' 'set有一個參數'/ a',這個參數可以做到這一點。 – Stephan

回答

1
@ECHO OFF 
SETLOCAL 
SET "sourcedir=c:\sourcedir" 
SET "tempfile=%temp%\##fn##.92" 
ECHO ::>"%tempfile%" 
FOR /f "delims=" %%a IN (
    'dir /s /b /a-d "%sourcedir%\*" ' 
) DO (
SET "fullname=%%a" 
SET "name=%%~na" 
SET "ext=%%~xa" 
CALL :chgname 
) 
del "%tempfile%" 
GOTO :EOF 

:chgname 
:: Proposed new name part - first 92 characters of existing name 
:: also prepare for adding modifier 
SET "newname=%name:~0,92%" 
SET /a modifier=0 
:modl 
:: See whether this name has already been found 
ECHO %newname%%ext%|FINDSTR /b /e /i /g:"%tempfile%" >NUL 
IF ERRORLEVEL 1 GOTO makechange 
:: existing name - modify it 
SET "newname=%name:~0,92%@%modifier%@" 
SET /a modifier+=1 
GOTO modl 

:makechange 
IF "%name%" NEQ "%newname%" ECHO REN "%fullname%" "%newname%%ext%" 
>>"%tempfile%" ECHO %newname%%ext% 
GOTO :eof 

合理簡單的問題。

獲取基本形式的目錄列表(僅限完整文件名),並將完整的文件名,名稱部分和擴展名部分應用於適當命名的變量。

將文件名操作爲由原始名稱部分的前92個字符組成的新名稱。預計需要修改這個新名稱,方法是建立一個修改器,以便可選地應用。

查看建議的新名稱是否已存在於已處理的NEW名稱的臨時文件中。如果沒有在該文件中找到,則可以安全地重命名(如果需要)並使用記錄名稱。

如果文件名已被使用,請將其修改爲原始的第一個92+「@」號碼@,然後按預期遞增修改器並重試。

只有兩個要求進一步評論 - 第一,我用@而不是!因爲!有着特殊的意義批量。其次,將::寫入臨時文件(tempfile的名稱是不相關的 - 我選擇了一個不太可能存在的...)意味着findstr不會因爲文件爲空而抱怨,但::不可能是真實的文件名。

/b /e /i選項findstr意味着該名echo版中必須完全匹配行(同時匹配/b - 開始和/e - 結束),但/i - 的情況下是不相關的。

+1

我得說男人真的有工作。我很高興你來這裏幫忙,請我下午我如何給予好的反饋,因爲我會完全做到這一點。 – Quardah

+1

另外我將「c:/ sourcedir」改成了「〜dp0」,因爲程序是可移植的。只是讓你知道這是我爲了完美工作而需要改變的唯一的東西。再次感謝!! – Quardah

+1

您可以按向上箭頭投票答案,並通過按下afaiaa接受答案。順便說一句 - 該計劃將只報告重命名。你需要在REN之前刪除'ECHO'才能真正執行重命名(可能很明顯 - 但你得到所有類型......) – Magoo