PowerShell自定义函数使用方法及Windows 10下排除node_modules打印目录树的解决方案
问题背景
我之前在Windows 10里处理单仓项目时,需要打印目录树结构但要排除node_modules目录,发现PowerShell原生功能做不到。后来找到一个自定义Tree函数的方案,说是能用tree -Exclude node_modules -Ascii > tree.txt实现需求,但照着步骤把源码粘贴到$PROFILE配置文件后,执行命令却没效果——原来我运行的还是系统原生的tree命令,不是自定义的函数。
PowerShell自定义函数的正确使用方法
要让自定义Tree函数生效,得按以下步骤来,每一步都不能少:
确认配置文件的创建与编辑
打开PowerShell执行notepad $PROFILE,如果提示文件不存在,直接选择创建新文件就行。这个$PROFILE是PowerShell的用户配置文件,每次启动PowerShell都会自动加载这里面的脚本和函数。粘贴自定义函数源码
把找到的那个Tree函数源码复制粘贴到打开的记事本里,保存并关闭记事本。这个函数的核心是重写了tree命令,添加了-Exclude参数支持。调整执行策略让配置生效
默认情况下PowerShell会阻止运行本地脚本,所以得先设置合适的执行策略:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser这个命令允许当前用户运行自己编写的本地脚本,远程下载的脚本则需要签名,安全性有保障。执行时按提示输入
Y确认就行。加载配置并验证函数
- 要么重启PowerShell,要么在当前会话里执行
. $PROFILE(注意前面的点和空格,这是“点源”命令,用来加载配置文件)。 - 执行
Get-Command tree,如果返回的CommandType是Function,说明自定义函数已经生效了;如果还是Application(指向系统的tree.exe),那可能是有别名冲突,执行Remove-Item Alias:tree删除默认的tree别名,再验证一次就没问题了。
- 要么重启PowerShell,要么在当前会话里执行
执行目标命令
这时候再运行tree -Exclude node_modules -Ascii > tree.txt,就能生成排除node_modules的ASCII格式目录树文件了。
Windows 10下其他更简便的方法
如果不想折腾自定义函数,还有几个现成的办法:
用CMD命令结合过滤
打开CMD窗口(或者在PowerShell里也能直接用),执行:tree /F /A | findstr /v /i "node_modules" > tree.txt解释下参数:
/F显示目录下的文件,/A用ASCII字符绘制树形;findstr /v是排除包含指定字符串的行,/i忽略大小写。缺点是会把所有包含node_modules的行都过滤掉,可能误删文件名带这个字符串的行,但单仓项目里一般只有node_modules目录,所以基本能用。使用第三方工具(GNU Tree)
下载安装GNU Tree工具后,直接执行:tree -I node_modules > tree.txt这个工具功能更强大,支持多种排除规则和输出格式,适合经常需要打印目录树的场景。
PowerShell原生递归脚本(简易版)
如果不需要美观的树形字符,只是要遍历目录结构,也可以写个简单的递归函数:function Get-CleanDirTree { param( [string]$RootPath = ".", [string]$ExcludeDir = "node_modules" ) Get-ChildItem -Path $RootPath -Directory -Exclude $ExcludeDir | ForEach-Object { Write-Output $_.FullName Get-CleanDirTree -RootPath $_.FullName -ExcludeDir $ExcludeDir } } Get-CleanDirTree > tree.txt这个脚本会递归输出所有排除指定目录后的子目录路径,虽然没有树形结构,但胜在简单易写。
内容的提问来源于stack exchange,提问作者jka




