删除文件名超过 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"
)
)
我正在寻找创建 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"
)
)