Batch file .bat测量文件路径长度并将其放入.txt文件中

Batch file .bat测量文件路径长度并将其放入.txt文件中,batch-file,Batch File,我正在尝试创建一个.bat文件,该文件将在给定文件夹中的所有文件中运行,测量文件+路径的长度,如果超过50个字符,则将文件和路径写入.txt文件 我基本上是一个n00b,所以不太高级,而且解释得很好;) 我正在写一个文件 echo%File%>filer.txt 其中文件应包含文件名和路径 编辑: 对不起,我对它应该执行的任务的描述可能有点不清楚。我的意思是,循环给定文件夹的文件和子文件夹。并在文档中返回路径超过50的文件,包括驱动器和文件类型 你可以用这个: @echo off setloca

我正在尝试创建一个.bat文件,该文件将在给定文件夹中的所有文件中运行,测量文件+路径的长度,如果超过50个字符,则将文件和路径写入.txt文件

我基本上是一个n00b,所以不太高级,而且解释得很好;)

我正在写一个文件

echo%File%>filer.txt

其中文件应包含文件名和路径

编辑:
对不起,我对它应该执行的任务的描述可能有点不清楚。我的意思是,循环给定文件夹的文件和子文件夹。并在文档中返回路径超过50的文件,包括驱动器和文件类型

你可以用这个:

@echo off
setlocal EnableDelayedExpansion
for %%g in ("*") do (
set "File=%%~dpnxg"
>x echo !File!&for %%? in (x) do set /a strlength=%%~z? - 2&del x
if !strlength! gtr 50 echo !File! >> filer.txt
)
这将遍历当前文件夹中的所有文件,并将其驱动器、路径、名称和扩展名放入变量
%File%
。然后它将
%File%
写入临时文件x,并从中获取stringlength,然后删除x。如果字符串长度大于50,它会将文件名写入
filer.txt

您需要在循环中使用变量

注意,此代码当前使用驱动器、路径、文件名和扩展名。更改行
设置“File=%~dpnxg”
以更改此行为(
[d]rive,[p]ath,[n]ame,e[x]tension
,必须使用
g

您可以使用以下方法:

@echo off
setlocal EnableDelayedExpansion
for %%g in ("*") do (
set "File=%%~dpnxg"
>x echo !File!&for %%? in (x) do set /a strlength=%%~z? - 2&del x
if !strlength! gtr 50 echo !File! >> filer.txt
)
这将遍历当前文件夹中的所有文件,并将其驱动器、路径、名称和扩展名放入变量
%File%
。然后它将
%File%
写入临时文件x,并从中获取stringlength,然后删除x。如果字符串长度大于50,它会将文件名写入
filer.txt

您需要在循环中使用变量


注意,此代码当前使用驱动器、路径、文件名和扩展名。更改行
设置“File=%%~dpnxg”
以更改此行为(
[d]rive,[p]ath,[n]ame,e[x]tension
,必须使用
g

正如Dennis已经指出的,批处理没有用于获取路径长度的内置解决方案。但如果您只想知道,如果字符串大于
n
,只需检查
n+1
位置是否有字符:

if "%string:~51,1%" neq "" echo %string% is longer than 50 characters
比计算字符快得多

结合丹尼斯的逻辑:

@echo off
setlocal EnableDelayedExpansion
(
  for %%g in ("*") do (
    set "File=%%~dpnxg"
    if "!File:~51,1!" neq "" echo !File!
  )
)>filer.txt

我将整个
for
循环放入另一个块中,只重定向一次到输出文件。这要快得多(
>
会打开文件,写一行并关闭文件,然后再打开它等等)

正如Dennis已经指出的,batch没有内置的解决方案来获取路径长度。但如果您只想知道,如果字符串大于
n
,只需检查
n+1
位置是否有字符:

if "%string:~51,1%" neq "" echo %string% is longer than 50 characters
比计算字符快得多

结合丹尼斯的逻辑:

@echo off
setlocal EnableDelayedExpansion
(
  for %%g in ("*") do (
    set "File=%%~dpnxg"
    if "!File:~51,1!" neq "" echo !File!
  )
)>filer.txt

我将整个
for
循环放入另一个块中,只重定向一次到输出文件。这要快得多(
>
会打开文件,写一行,然后关闭文件,然后再打开一次等等)

哦,天哪,如果有一件事batch不擅长,那就是测量字符串长度。我认为您的
不高级
是一个很糟糕的情况。path+文件是否包括驱动器,所以
C:\path\somefile
,或者
path\somefile
?它是否包含扩展名?检查这个@npocmaka虽然它使用临时文件,但我真的很喜欢这个解决方案,主要是因为它是单行的。哦,天哪,如果有一件事batch不擅长的话,那就是测量字符串长度。我认为您的
不高级
是一个很糟糕的情况。path+文件是否包括驱动器,所以
C:\path\somefile
,或者
path\somefile
?它是否包含扩展名?检查这个@npocmaka虽然它使用临时文件,但我非常喜欢这个解决方案,主要是因为它是单行的。为什么我没有想到这个呢。我很抱歉,我对它应该执行的任务的描述可能有点不清楚。我的意思是,循环给定文件夹的文件和子文件夹。然后在文档中返回路径超过50的文件,包括驱动器和文件类型。只需使用
for
参数
/R
。有关详细信息,请参见<代码>获取/?。谢谢,我在午餐后让它工作,代码需要我的一个刹车(请回答丹尼斯;)我对“代码”有点不确定!档案:~51,1!“neq‘嗯,我能猜出大部分意思,但我想要更详细的形式。
%var:~n,m%
提取一个子串,从字符
n
开始,长度
m
(现在,我想起来,
n
从零开始,所以它应该是
50
,而不是
51
)。在
set/?
中有一个例子。为什么我没有想到这一点。默默地判断他自己对不起,我可能对应该执行的任务的描述有点不清楚。我的意思是,循环给定文件夹的文件和子文件夹。然后在文档中返回路径超过50的文件,包括驱动器和文件类型。只要使用
获取
参数
/R
。有关详细信息,请参见
获取/?
。感谢我在午餐后使其正常工作,代码需要我的一个刹车(请参见我对丹尼斯的回答)我对“code!文件:~51,1!“neq”有点不确定。我可以猜出大部分意思,但我想要更详细的表单。
%var:~n,m%
提取一个子串,从字符
n
开始,长度
m
(现在,我想,
n
从零开始,所以它应该是
50
,而不是
51
)。
set/?
中有一个例子。如果当前目录中有一个名为
x
的文件夹,则失败:
访问被拒绝
,然后是
4094d:\bat\x\*,你确定(是/否)?
对不起,我的des可能有点不清楚