Windows批处理命令快速获取文件夹下特定类型的文件名(2022.5.15)
Posted jing_zhong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows批处理命令快速获取文件夹下特定类型的文件名(2022.5.15)相关的知识,希望对你有一定的参考价值。
Windows批处理命令快速获取文件夹下特定类型的文件名 (2022.5.15)
1、需求分析
在日常的学习和工作中,可能大家或多或少会遇到这样一个问题:对于电脑文件资源管理器中的某个文件夹,该文件夹下包含许多不同类型的文件,此时自己想要立刻获取某种特定类型对应的全部文件名。当然,不可否认的是,我们自然是可以找到很多种方法来解决这个问题,但关键在于如何简单直接、快速而又高效地完成这个任务呢?
2、batch简介
batch批处理是一种脚本语言,可称为宏,用于对一些对象进行批处理流程化的操作,任何操作系统中可运行的执行程序都可以放到批处理文件中来运行。常见的批处理主要包含DOS
批处理和PowerShell
批处理,另外很多专业软件通常也内置有批处理功能,目的是便于用户进行自动化操作。
在Windows
系统中,批处理命令可由PowerShell
和cmd
窗口来解释运行,对应的批处理文件扩展名一般为.cmd和.bat
。
批处理文件称为批处理程序,是由一条条的DOS
命令组成的普通文本文件,可以用Notepad
直接编辑或用DOS
命令创建,也可以用DOS
下的文本编辑器Edit.exe
来编辑。在cmd prompt
下键入批处理文件的名称
或者直接双击批处理文件
,操作系统就会调用Cmd.exe
运行该批处理程序。
|
|
3、代码实现
对普通用户而言,当搜索结果较少时,自己可以手动逐个复制并粘贴文件名,但这样做效率低、速度慢、容易导致错误,且手工劳动量会随搜索结果数目的增多而显著增加;而对于程序员和开发者而言,大抵是利用现有的编程语言(C++、Python、Java、C#、Matlab、C、VB等)编写执行程序,那么无论采用何种编程语言,都要经历三个步骤:配置环境、编写代码、编译运行
,最终获得程序执行的结果。这里推荐大家利用Windows
系统自带的批处理命令脚本来实现,因为无需任何环境配置,简单直接,十分高效,只需熟悉常用的Shell
命令即可。
如下图所示,给出一个实例,在D:\\test
文件夹包含多种不同格式类型的文件,如.txt文本文件、.jpg图片文件、.pdf、.json数据文件、.xlsx表格文件、.docx文档文件、.pptx演示文稿文件、.mp4视频文件
等.
3.1 八种编程语言分别实现
这里分别利用C#、C++、Java、Python、Matlab、C、Scala、VB
八种编程语言来实现文件夹下特定文件类型的搜索功能。
3.1.1 C# 实现
利用Microsoft Visual Studio 2015
编写C#
程序实现,具体代码和运行结果如下。
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace GetFileNameWithSpecificSuffix
class Program
static void Main(string[] args)
while (true)
string path = "", suffix_name = "";//所要查找的文件夹、要搜索的文件后缀名
Console.WriteLine("************获取文件夹下特定类型文件的文件名*************(Enter键退出)!");
Console.Write("请输入要搜索的文件目录(如 D:\\\\test):");
path = Console.ReadLine();
Console.Write("请输入要搜索的文件后缀名(如*.txt):");
suffix_name = Console.ReadLine();
if (path != "" && Directory.Exists(path))//文件目录不为空且文件夹存在
DirectoryInfo folder = new DirectoryInfo(path);
if (suffix_name == "")
foreach (FileInfo file in folder.GetFiles())
Console.WriteLine(file.Name);
else
foreach (FileInfo file in folder.GetFiles(suffix_name))
Console.WriteLine(file.Name);
else
Console.WriteLine("文件目录不存在,退出!");
break;//退出程序
3.1.2 C++ 实现
利用VS 2015
编写C++
程序实现,具体代码和运行结果如下。
main.cpp
#include <iostream>
#include <io.h>
using namespace std;
#define MAX_FILENAME_LENGTH 500
#define MAX_SUFFIX_LENGTH 6
void getFiles(char *path, char *suffixname)
__int64 hFile = 0;
struct _finddata_t singlefileinfo;
const char* str_add = "\\\\*";
size_t len3 = strlen(str_add),len_path = strlen(path);
for (size_t i = 0; i <len3; i++)
path[i + len_path] = str_add[i];
if ((hFile = _findfirst(path, &singlefileinfo)) != -1) //string p; p.assign(path).append("\\\\*").c_str() 替代此行的path
do
if ((singlefileinfo.attrib & _A_SUBDIR))
if (strcmp(singlefileinfo.name, ".") != 0 && strcmp(singlefileinfo.name, "..") != 0)
continue;
else
size_t length = strlen(singlefileinfo.name);
char *filename = singlefileinfo.name;
size_t pos_lastdot = -1;
for (size_t j = length - 1; j>0; j--)
if (filename[j] == '.')
pos_lastdot = j;
break;
if (pos_lastdot != -1)
size_t actualsuffix_len = length - pos_lastdot;
if (actualsuffix_len == strlen(suffixname))
char actualsuffix[MAX_SUFFIX_LENGTH];
memcpy(actualsuffix, filename + pos_lastdot, actualsuffix_len);
int flag = 1;
for (int k = 0; k<actualsuffix_len; k++)
if (actualsuffix[k] != suffixname[k])
flag = -1; break;
if (flag == 1)
cout<< filename<< endl;
while (_findnext(hFile, &singlefileinfo) == 0);
_findclose(hFile);
int main(int argc, char **argv)
while (true)
char path[MAX_FILENAME_LENGTH], suffixname[MAX_SUFFIX_LENGTH];
printf("*************查找指定文件夹下具有特定扩展名的所有文件***************\\n");
cout << "请输入要搜索的文件夹(如D:\\\\test):";
cin >> path;
cout << "请输入文件后缀名(如.jpg、.json、.md、.pdf、.xlsx、.pptx、.vsdx、.docx、.mp4、.bat、.txt):";
cin >> suffixname;
if (strlen(path) < 4 || strlen(suffixname) < 3)
break;
getFiles(path, suffixname);
return 0;
3.1.3 java 实现
利用Eclipse
编写Java
程序实现,具体代码和运行结果如下。
GetFIleNameBySuffix.java
package com;
import java.io.File;
public class GetFileNameBySuffix
public static void printFileNameBySuffix(String path,String suffixname)
System.out.println(path+"文件夹下后缀名为"+suffixname+"的文件:");
File file = new File(path); //获取其file对象
File[] fs = file.listFiles();
for(File f:fs)
String filename = f.getName();
if(f.isFile() && filename.endsWith(suffixname))
System.out.println(filename);
public static void main(String[] args)
String folder = "D:\\\\test";
String[] suffixname_list = ".jpg", ".json", ".md", ".pdf", ".xlsx", ".pptx", ".vsdx", ".docx", ".mp4", ".bat", ".txt";
for(int i=0;i<suffixname_list.length;i++)
printFileNameBySuffix(folder, suffixname_list[i]);
3.1.4 Python 实现
利用PyCharm
编写Python
程序实现,具体代码和运行结果如下。
GetFileNameBySuffix.py
import os
def getsuffixoffile(filename): # 获取文件对应字符串后缀名的函数
res = ''
lastdot_index = -1
for i in range(0, len(filename)):
if filename[i] == '.':
lastdot_index = i
if lastdot_index != -1:
res += filename[lastdot_index:len(filename)]
return res
def getFileNameBySuffixname(file_dir, suffix_name): # 获取某文件夹下特定后缀名的所有文件名
filelist = []
for root, dirs, files in os.walk(file_dir):
for file in files:
if getsuffixoffile(file) == suffix_name:
filelist.append(file)
return filelist
def shuchu(filelist):
for x in filelist:
print(x)
if __name__ == "__main__":
file_dir = 'D:\\\\test'
suffixname_list = ['.jpg', '.json', '.md', '.pdf', '.xlsx', '.pptx', '.vsdx', '.docx', '.mp4', '.bat', '.txt']
for i in range(0, len(suffixname_list)):
suffix_name = suffixname_list[i]
print('**************'+file_dir + '文件夹下后缀名为'+suffix_name+'的文件*******************')
result = getFileNameBySuffixname(file_dir, suffix_name)
shuchu(result)
3.1.5 Matlab 实现
利用Matlab R2021a
编写脚本实现,具体代码和运行结果如下。
folder = 'D:\\test';
suffixnamelist = '.jpg', '.json', '.md', '.pdf', '.xlsx', '.pptx', '.vsdx', '.docx', '.mp4', '.bat', '.txt';
filelist = dir(folder);
for i=1:1:length(suffixnamelist)
suffixname = suffixnamelist1,i;
fprintf(['**************',folder,'文件夹下后缀名为',suffixname,'的文件**************','\\n']);
for j=1:1:length(filelist)
if filelist(j).isdir == 0 && isSuffix(filelist(j).name,suffixname)
fprintf([filelist(j).name,'\\n'])
end
end
end
function [flag] = isSuffix(filename, suffix)%判断字符串以某个字符串结尾
flag = 0;
len1 = strlength(filename);
len2 = strlength(suffix);
suf_filename = filename(len1-len2+1:len1);
if strcmpi(suf_filename,suffix)
flag = 1;
end
end
3.1.6 C 实现
利用CodeBlocks
编写C
程序实现,具体代码和运行结果如下。
main.c
#include <stdio.h>
#include<io.h>
#define MAX_FILENAME_LENGTH 500
void getFiles(char *path, char *suffixname)
long hFile = 0;
struct _finddata_t singlefileinfo;
strcat(path, "\\\\*");
if ((hFile = _findfirst(path, &singlefileinfo)) != -1)
do
if ((singlefileinfo.attrib & _A_SUBDIR))
if (strcmp(singlefileinfo.name, ".") != 0 && strcmp(singlefileinfo.name, "..") != 0)
continue;
else
int length = strlen(singlefileinfo.name);
char *filename = singlefileinfo.name;
int pos_lastdot = -1;
for(int j=length-1;j>0;j--)
if(filename[j] == '.')
pos_lastdot = j;
break;
if (pos_lastdot != -1)
int actualsuffix_len = length - pos_lastdot;
char actualsuffix[actualsuffix_len];
if (actualsuffix_len == strlen(suffixname))
memcpy(actualsuffix,filename + pos_lastdot,actualsuffix_len);
int flag = 1;
for(int k=0;k<actualsuffix_len;k++)
if(actualsuffix[k] != suffixname[k])
flag = -1;break;
if(flag == 1)
printf("%s\\n",filename);
while (_findnext(hFile, &singlefileinfo) == 0);
_findclose(hFile);
int main()
while(1)
printf("*************查找指定文件夹下具有特定扩展名的所有文件***************\\n");
printf("请输入要搜索的文件夹(如D:\\\\test):");
char path[MAX_FILENAME_LENGTH];
// scanf("%s",path);
char *str1 = gets(path);
char suffixname[6];
printf("请输入文件后缀名(如.jpg、.json、.md、.pdf、.xlsx、.pptx、.vsdx、.docx、.mp4、.bat、.txt):");
// scanf("%s",suffixname);
char *str2 = gets(suffixname);
if(strlen(str1) < 4 || strlen(str2) < 3)
break;
getFiles(path,suffixname);
return 0;
3.1.7 Scala 实现
利用IDEA
编写Scala
程序实现,具体代码和运行结果如下。
TestGetFileNameBySuffix.scala
import java.io.File
object TestGetFileNameBySuffix
def main(args: Array[String]): Unit =
val dir : String = "D:\\\\test";
var suffixname_list = Array(".jpg", ".json", ".md", ".pdf", ".xlsx", ".pptx", ".vsdx", ".docx", ".mp4"以上是关于Windows批处理命令快速获取文件夹下特定类型的文件名(2022.5.15)的主要内容,如果未能解决你的问题,请参考以下文章
Windows批处理命令快速获取文件夹下特定类型的文件名(2022.5.15)