删除文件名超过 x 的文件

Delete files with filenames longer than x

我正在寻找创建 BAT 文件的帮助,以帮助删除超过特定文件名长度的视频和图像。

一些背景知识:

我们有一个定制的应用程序,但我们没有源代码。它从提要更新视频。最近我们遇到了 "buffer overrun detected" 个错误。我们认为超过 90 个字符的文件名正在成为一个问题。

我想在它们成为问题之前删除这些 WMV 和 JPG 文件。我们通常使用bat文件来执行这些小任务。

不要拘泥于 OS 特定的东西,使用可以在任何平台上 运行 的脚本语言,例如Node.js

var fs = require("fs");

var folderName = __dirname;  // for current folder
var maxlength = 90;

function getFiles(dir, files_) {
    files_ = files_ || [];
    var files = fs.readdirSync(dir);
    for ( var i in files) {
        var name = dir + '/' + files[i];
        if (fs.statSync(name).isDirectory()) {
            getFiles(name, files_);
        } else {
            files_.push(name);
        }
    }
    return files_;
}

var files = getFiles(folderName);
console.log(files);
for (var i = 0; i < files.length; i++) {
    filename = files[i];
    if (filename.length > maxlength) {
        console.log("Deleting " + filename);
        fs.unlinkSync(filename);
    }
}

没有外部工具(未测试):

@echo off

rem:::: set the correct directory
set "rootdir=c:\somewhere"
pushd "%rootdir%"

setlocal enableDelayedExpansion

for %%# in (*.WMV *.JPG) do (

    call ::strlen0 "%%~nx#" len
    if !len! GEQ 90 (
        rem:::: remove the echo if the correct files are listed
        echo del /q /f "%%~nx#"
    )

)

endlocal



exit /b 0
:strlen0  StrVar  [RtnVar]
  setlocal EnableDelayedExpansion
  set "s=#!%~1!"
  set "len=0"
  for %%N in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
    if "!s:~%%N,1!" neq "" (
      set /a "len+=%%N"
      set "s=!s:~%%N!"
    )
  )
  endlocal&if "%~2" neq "" (set %~2=%len%) else echo %len%
exit /b

注意评论 - 这些是您需要更改脚本的地方。

我认为这是最简单的方法:

@echo off
setlocal EnableDelayedExpansion

for %%a in (*.WMV *.JPG) do (
   set "filename=%%a"
   if "!filename:~90!" neq "" (
      ECHO del "%%a"
   )
)