最近想把某项目下的文件遍历执行,因为只执行固定格式的文件,比如node执行js文件,那么需要遍历所有js文件,所以想分两步走,第一步循环遍历所有js文件名称并写入txt文件中,第二步读取txt文件并循环执行。

前提,我是写在bat文件中的,所以有一些注意事项要备注下。

windows中的bat文件注释行不是#,而是分为关键字双冒号(::)和@REM,手写感觉双冒号更美观,但用快捷键注释默认加的是@REM关键字。后来发现在例如for循环中使用::会导致异常,而使用@REM没问题。

windows中bat文件首行不需要#! /bin/bash

cmd中有可以直接列出某目录下文件的指令dir,而且默认是换行的,简便!关于dir的参数有/B /S /O /A(备注:cmd中不区分大小写),可以参考文章:https://blog.csdn.net/wzj_110/article/details/116844812

:: 输出文件夹下所有文件夹和文件到txt
dir /b >2022list.txt

指定文件类型:

:: 输出js文件
dir /b *.js >2022list.txt

然后读取txt文件,并循环执行,cmd中循环用的也是for。

:: 读取文件并按行输出
@echo off
for /f %%i in (2022list.txt) do (
    echo %%i
    node %%i >> 2022_log/out/%%i.txt 2>> 2022_log/error/%%i.txt
)

注意:cmd中直接输入命令的话写一个%就行,但在bat脚本中需要写两个百分号%%

@echo off可以不输出命令行本身。

在执行某命令时出现了错误:ECHO 处于关闭状态,现在没有复现,找了解答说要加setlocal enabledelayedexpansion,没复现,以后遇到再记录吧,可参考:https://blog.csdn.net/qq_39648255/article/details/120180948 。


今天又突然想,能不能直接用for循环遍历文件,就不用先输出名称到txt文件了。

然后研究了下for,发现可行。

cmd中的for参数有/D /R /L /F,可以多个参数一起用,可以参考:http://wjhsh.net/MCSFX-p-12799505.html 。

for /R [path] %%variable in (set) do cmd    循环遍历所有子文件夹和文件
for /D [path] %%variable in (set) do cmd    只循环遍历文件夹
for /L %%variable in(Start#,Step#,End#) do cmd    迭代数值范围

for /F    遍历当前目录所有文件和文件夹,有三种用法
for /F ["options"] %%i IN (file) DO cmd
for /F ["options"] %%i IN ("string") DO cmd
for /F ["options"] %%i IN ('cmd') DO cmd

我的需求直接用

:: 直接遍历文件夹下某类型文件
for %%i in (*.js)do echo %%i>>a.txt
pause

神奇不神奇,不加任何参数即可!!!!


关于for /f 还有特殊的技能:Delim、Tokens、skip,具体可以参考文章:https://blog.csdn.net/qq1195365047/article/details/127023833

哦,有个很扯淡的事,win10现在文件夹中右键默认启动的cmd是powershell,但是很多命令在powershell中都无法执行,比如dir /b就报错,以前还可以通过修改注册表自己改成cmd,现在好像都没法改了,也不知道微软干啥玩意。。。