【问题标题】:.bat measure file path length and put it in a .txt-file.bat 测量文件路径长度并将其放入 .txt 文件中
【发布时间】:2016-09-28 06:46:07
【问题描述】:

我正在尝试制作一个 .bat 文件,该文件将遍历给定文件夹中的所有文件,测量文件+路径的长度以及它是否比例如长。文件和路径的 50 个字符被写入 .txt 文件。

我几乎是一个 n00b,所以不高级,而且解释得很好;)。

我正在写入一个文件

echo %File% > filer.txt

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

编辑: 对不起,我对它应该执行的任务的描述可能有点不清楚。我要说的是,循环遍历给定文件夹的文件和子文件夹。并在文档中返回路径超过 50 的文件,包括 Drive 和 Filetype。

【问题讨论】:

  • 天哪,如果有一个batch不擅长的事情,那就是测量字符串长度。我认为你的not to advanced 是一个糟糕的条件。
  • 路径+文件是否包括驱动器,所以C:\path\somefile,或path\somefile?它是否包含扩展名?
  • @npocmaka 虽然它使用临时文件,但我真的很喜欢this 解决方案,主要是因为它是单行的。

标签: batch-file


【解决方案1】:

正如 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 循环放到另一个块中,只重定向一次到输出文件。这要快得多(>> 会打开文件,写一行并关闭文件,然后再次打开它等等......)

【讨论】:

  • 我怎么没想到。 默默地评判自己
  • 对不起,我对它应该执行的任务的描述可能有点不清楚。我要说的是,循环遍历给定文件夹的文件和子文件夹。并在文档中返回路径超过 50 的文件,包括 Drive 和 Filetype。
  • 只需使用for参数/R。详情请见for /?
  • 谢谢我在午餐后让它工作,代码只是需要我刹车(请看我对丹尼斯的回答;)我对'代码有点不确定!文件:~51, 1!" neq ' 好吧,我能猜到大部分意思,但我想要更详细的形式。
  • %var:~n,m% 提取从字符 n 开始,长度为 m 的子字符串(现在,我想起来了,n 以零开头,所以它应该是 50 而不是51)。 set /?中有一个例子。
【解决方案2】:

你可以用这个:

@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,并从中获取字符串长度,然后删除x。如果字符串长度大于 50,它会将文件名写入filer.txt

您需要delayed expansion 才能处理循环内的变量。

注意,此代码当前使用驱动器、路径、文件名和扩展名。更改行 set "File=%%~dpnxg" 以更改此行为([d]rive, [p]ath, [n]ame, e[x]tensiong 是必要的)

【讨论】:

  • 如果当前目录中有一个名为x文件夹 失败:Access denied 然后4094d:\bat\x\*, Are you sure (Y/N)?
  • 对不起,我对它应该执行的任务的描述可能有点不清楚。我要说的是,循环遍历给定文件夹的文件和子文件夹。并在文档中返回路径超过 50 的文件,包括 Drive 和 Filetype。
  • @SusanneKahl 如果它应该遍历所有文件,甚至是子文件夹中的文件,您需要将for %%g in ( 替换为for /r %%g in (,这也适用于@Stephan 的回答
  • 不幸的是,我只能将更改用于您的代码,而不能用于 Stephans。我可以简要介绍一下这些线条的作用吗?现在我让它工作了,但不知道如何;)
  • 是的,我也在文件夹 X 上拒绝访问,但仅在某些(更大的)文件夹中。
猜你喜欢
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
相关资源
最近更新 更多