```PowerShell #---------------------------------------------------------------------- # 控制台输出编码设置为 UTF-8 #---------------------------------------------------------------------- [Console]::InputEncoding = [System.Text.Encoding]::UTF8 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 #---------------------------------------------------------------------- # PSReadLine 配置 #---------------------------------------------------------------------- if ($Host.Name -eq 'ConsoleHost' -and $Host.UI.SupportsVirtualTerminal) { try { # --- 预测与补全 --- Set-PSReadLineOption -PredictionSource HistoryAndPlugin Set-PSReadLineOption -PredictionViewStyle ListView Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete # --- 历史记录优化 --- Set-PSReadLineOption -HistoryNoDuplicates Set-PSReadLineOption -MaximumHistoryCount 10000 } catch { Write-Verbose "PSReadLine 配置未生效: $($_.Exception.Message)" } } #---------------------------------------------------------------------- # 自定义快捷命令 #---------------------------------------------------------------------- function ep { code $PROFILE } function vim { nvim $args } #---------------------------------------------------------------------- # 查找并可选择性删除当前目录及子目录下的所有空文件夹。 # - 会自动忽略 .git 目录。 # - 解决了嵌套空目录的删除顺序问题。 # - 支持 -WhatIf 和 -Confirm 安全参数。 # - 遵循 PowerShell 最佳实践。 #---------------------------------------------------------------------- function Get-EmptyDirectory { [CmdletBinding(SupportsShouldProcess = $true)] param ( [Parameter(Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [string]$Path = ".", [Switch] [Alias('d')] $Delete ) # 要忽略的目录名称列表 $ignoreDirs = @(".git", ".idea", ".vscode", "node_modules", "dist") # 1. 获取所有目录,递归排除 ignoreDirs $emptyDirs = Get-ChildItem -Path $Path -Recurse -Directory -ErrorAction SilentlyContinue | Where-Object { # 当前目录是否属于忽略名单 $name = $_.Name.ToLower() if ($ignoreDirs -contains $name) { return $false } $lowerPath = $_.FullName.ToLower() if ($lowerPath -match 'node_modules|dist') { return $false } # 是否为空目录 -not $_.GetFileSystemInfos() } # 2. 按路径长度降序排列,保证先删除子目录 $sortedEmptyDirs = $emptyDirs | Sort-Object { $_.FullName.Length } -Descending foreach ($dir in $sortedEmptyDirs) { # 输出管道对象 Write-Output $dir if ($Delete) { if ($PSCmdlet.ShouldProcess($dir.FullName, "Delete Empty Directory")) { Remove-Item -LiteralPath $dir.FullName -Force Write-Host "Deleted empty directory: $($dir.FullName)" -ForegroundColor Green } } } } Set-Alias -Name fempty -Value Get-EmptyDirectory #---------------------------------------------------------------------- # 函数: Get-GitCodeLines #---------------------------------------------------------------------- # # 用法 1(默认统计当前 Git 仓库,当前用户,最近 30 天): # Get-GitCodeLines # # 用法 2(指定具体日期范围): # Get-GitCodeLines -Author "zhangsan" -Since "2025-01-01" -Until "2025-06-30" # function Get-GitCodeLines { param ( [string]$Author = "$(git config user.name)", [string]$Since, # yyyy-MM-dd [string]$Until # yyyy-MM-dd ) # 检查是否在 Git 仓库中 if (-not (Test-Path ".git")) { Write-Host "❌ 当前目录不是 Git 仓库。" -ForegroundColor Red return } # 若未提供日期,则使用最近 30 天 if (-not $Since) { $Since = (Get-Date).AddDays(-30).ToString("yyyy-MM-dd") } if (-not $Until) { $Until = (Get-Date).ToString("yyyy-MM-dd") } Write-Host "📊 正在统计 $Author 从 $Since 到 $Until 的代码变动..." -ForegroundColor Cyan $log = git log ` --since=$Since ` --until=$Until ` --author=$Author ` --pretty=tformat: ` --numstat if ($LASTEXITCODE -ne 0) { Write-Host "❌ git log 执行失败,请检查参数。" -ForegroundColor Red return } if (-not $log) { Write-Host "⚠️ 该时间段内无提交记录。" -ForegroundColor Yellow return } $added = 0 $deleted = 0 foreach ($line in $log) { if ($line -match "^\d+\s+\d+") { $cols = $line -split "\s+", 3 $added += [int]$cols[0] $deleted += [int]$cols[1] } } $net = $added - $deleted $total = $added + $deleted Write-Host "✅ 作者: $Author" -ForegroundColor Green Write-Host "📆 时间范围: $Since ~ $Until" Write-Host "🟢 增加: $added 行" Write-Host "🔴 删除: $deleted 行" Write-Host "🔵 净增: $net 行" -ForegroundColor $(if ($net -gt 0) { "Green" } elseif ($net -lt 0) { "Red" } else { "Gray" }) Write-Host "📈 总变动: $total 行" } Set-Alias singbox "D:\MyCode\netbox\sing-box\singbox.ps1" ```