Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 确定批处理文件的文件名长度_Batch File - Fatal编程技术网

Batch file 确定批处理文件的文件名长度

Batch file 确定批处理文件的文件名长度,batch-file,Batch File,我需要在一个小项目的.bat文件中处理两件事。首先,我必须知道我启动.bat的同一文件夹(递归)中包含的任何文件名是否超过100个字符。如果是这样的话,我需要让它长92个字符,并保留扩展名 例如,我有以下文件名: 长得令人难以置信的文件名很抱歉,就像Medam NSPAMJES一样,它的使用时间甚至接近100年 以上文件名为110个字符。我需要保留扩展名,因此程序应将文件重命名为: 长得令人难以置信的文件名对于类似于MedamNSPAMJESUS的文件名来说非常抱歉,甚至接近100 yetalm

我需要在一个小项目的
.bat
文件中处理两件事。首先,我必须知道我启动
.bat
的同一文件夹(递归)中包含的任何文件名是否超过100个字符。如果是这样的话,我需要让它长92个字符,并保留扩展名

例如,我有以下文件名:

长得令人难以置信的文件名很抱歉,就像Medam NSPAMJES一样,它的使用时间甚至接近100年

以上文件名为110个字符。我需要保留扩展名,因此程序应将文件重命名为:

长得令人难以置信的文件名对于类似于MedamNSPAMJESUS的文件名来说非常抱歉,甚至接近100 yetalmos.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
但是我不能在
中为
设置
,它也不能做基本的数学运算(也就是说,它不能做
-5
运算)

第二件事,我认为在第一件事完成后应该更容易,就是简单地比较文件夹中的所有文件名(再次递归),并确保没有文件名是相同的。如果程序发现任何相同的文件名,则应重命名第二个匹配项,以便在末尾添加类似于
l1l
的内容。(我不能在这里使用括号,因此我使用两个
l
s来覆盖数字。)唯一需要注意的是文件扩展名,因为我不能在文件扩展名之后添加任何内容,以免它们无法使用

有人能解释一下如何做到这一点吗?我真的希望自己能够解决这个问题,但我只是缺乏批处理编程的经验

@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+“
@
a编号
@
”,预先增加修改器,然后重试

只需要两条注释——首先,我使用了
@
而不是
对批处理具有特殊意义。其次,将
::
写入tempfile(tempfile的名称不相关-我选择了一个不太可能存在的名称…)意味着
findstr不会因为文件为空而抱怨,但
不可能是真正的文件名

findstr
/b/e/i
选项意味着插入的名称
echo
必须完全匹配一行(匹配
/b
-begin和
/e
-end),但
/i
-大小写无关

相当简单的问题

获取基本格式的目录列表(仅限完整文件名),并将完整文件名、名称部分和扩展部分应用于适当命名的变量

将文件名操纵为新名称,该名称由原始名称部分的前92个字符组成。通过建立可选择应用的修饰符,预测修改此新名称的需要

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

如果文件名已被使用,请将其修改为最初的92+“
@
a编号
@
”,预先增加修改器,然后重试

只需要两条注释——首先,我使用了
@
而不是
对批处理具有特殊意义。其次,将
::
写入tempfile(tempfile的名称不相关-我选择了一个不太可能存在的名称…)意味着
findstr不会因为文件为空而抱怨,但
不可能是真正的文件名


findstr
/b/e/i
选项意味着插入的名称
echo
必须完全匹配一行(同时匹配
/b
-begin和
/e
-end),但
/i
-大小写无关。

你应该将其分为两个问题。要“做基础数学”试试
set/?
set有一个参数
/a`可以完全做到这一点。你应该把它分成两个问题。要“做基础数学”,试试
set/?
set有一个参数
/a`可以完全做到这一点。我得说,那个人真的很管用。我很高兴你来这里帮助我,请pm我如何给好的反馈,因为我会完全这样做。此外,我将“c:/sourcedir”更改为“~dp0”,因为该程序是可移植的。只是想让你知道,这是我唯一需要改变的东西,它才能完美工作。再次感谢!!您可以按向上箭头向上投票,然后按勾号afaiaa接受答案。顺便说一句,程序将只报告重命名。您需要在
REN
之前删除
ECHO
,才能真正执行重命名(可能很明显,但您会得到所有类型…),事实上,我从那里删除了ECHO。再次感谢我的朋友,非常感谢你的帮助。我需要15个声望来提升你。。。这太愚蠢了。我一有资格就回来。我得说那真的很管用。我很高兴你来这里帮助我,请pm我如何给好的反馈,因为我会完全这样做。此外,我将“c:/sourcedir”更改为“~dp0”,因为该程序是可移植的。只是想让你知道那是