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在 a 里面FOR,它也不能做基本的数学运算(即它不能做-5运算)。

第二件事,我认为一旦完成第一件事应该会更容易,就是简单地比较文件夹中的所有文件名(再次递归)并确保没有文件名相同。如果程序发现任何相同的文件名,则应重命名第二次出现以l1l在末尾添加类似的内容。(我这里不能用括号,所以我用两个ls 代替数字。)你唯一需要注意的是文件扩展名,因为我不能在文件扩展名后面添加任何东西,以免它们变成无法使用。

谁能解释如何做到这一点?我真的很想自己解决这个问题,但我只是缺乏批处理编程的经验。

4

1 回答 1

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 个字符组成的新名称。预计需要通过建立一个可选应用的修饰符来修改这个新名称。

查看提议的新名称是否已存在于已处理的新名称的临时文件中。如果在该文件中找不到,可以安全地重命名(如果需要)并记录使用的名称。

如果文件名已被使用,请将其修改为原始的前 92+“anumber @@,增加预期的修饰符并重试。

只需要进一步的两个注释 - 首先,我使用@而不是!因为!批处理具有特殊含义。其次,写入::临时文件(临时文件的名称无关紧要 - 我选择了一个不太可能存在的文件......)意味着findstr不会因为文件为空而抱怨,但::不可能是真正的文件名。

表示ed in 的名称必须与一行完全匹配(同时匹配- begin 和- end )但- 大小写无关的选项/b /e /ifindstrecho/b/e/i

于 2013-08-06T06:28:23.960 回答