Files
BakNRet/BakNRet/BakNRet.psd1
T
Shuery d9d7967e64 feat(tui): 定位写与按列对齐(第一轮第三块)
Format-BakNRetPaddedText:按**列宽**补齐或裁剪,且绝不切开宽字符 —— 剩余宽度差 1 列而下一个字符要占 2 列时,停下用空格补那 1 列。返回的字符串保证恰好 N 列,这条不变式是画边框的基础(按 .Length 补会让边框歪,按 .Length 裁会把汉字劈成半个显示成乱码)。

Write-BakNRetAt:第一道闸门是 [Console]::IsOutputRedirected,**不是** $Host.UI.SupportsVirtualTerminal(实测后者无控制台时仍返回 True,而 SetCursorPosition 会抛异常)。没有控制台就完全不定位、只把文本写出去;坐标越界时跳过定位但仍写出文本 —— 计划任务与窄窗口不该让 TUI 崩掉,只是画得难看一点。颜色走 Write-Host -ForegroundColor(零 VT 依赖)。

验收:断言 10 条(含"裁剪后恰好 5 列且不是 4 个字符"这条关键判据);两版手工输出一致;test.ps1 9/9 全绿。
2026-09-27 15:52:34 +08:00

106 lines
3.9 KiB
PowerShell

<#
模块清单。
为什么需要它:把"这个模块对外提供什么"变成一份可读的契约。这里 FunctionsToExport 是
**显式白名单**(官方性能指南明确要求不用通配符;PSUseToExportFieldsInManifest 也是恒开
的规则、关不掉)。名字少写一个,对应函数就不会被导出 —— 这是有意的:宁可导入方报
"找不到命令",也不要静默少一个函数。
CompatiblePSEditions 声明"桌面版与核心版都能导入":本模块兼容 Windows PowerShell 5.1
与 PowerShell 7.x。代价是放弃 PS 4.0 及以下,那是刻意的。
#>
@{
RootModule = 'BakNRet.psm1'
ModuleVersion = '1.0.0'
GUID = '9bc892ed-f852-4468-b1e7-d71a91cf2913'
Author = 'Shuery'
Description = 'BakNRet 公共模块:日志、外部命令调用、清单与名录解析、归档命名与暂存、manifest、安全描述符。兼容 Windows PowerShell 5.1 与 PowerShell 7.x。'
PowerShellVersion = '5.1'
CompatiblePSEditions = @('Desktop', 'Core')
FunctionsToExport = @(
'Format-BakNRetPaddedText',
'Write-BakNRetAt',
'Get-BakNRetKeyName',
'New-BakNRetInputDriver',
'Read-BakNRetKey',
'Get-BakNRetCellWidth',
'Write-BakNRetRunSummary',
'Save-BakNRetItemRecord',
'New-BakNRetItemRecord',
'Find-BakNRet7zExecutable',
'Resolve-BakNRetRootedPath',
'Test-BakNRetItemSelected',
'Enter-BakNRetRunLock',
'Exit-BakNRetRunLock',
'Get-BakNRetRunLockPath',
'Set-BakNRetDebug',
'Start-BakNRetLog',
'Stop-BakNRetLog',
'Get-BakNRetLogPath',
'Write-BakNRetLog',
'Test-BakNRetAdministrator',
'Get-BakNRetFreeSpaceGB',
'ConvertTo-BakNRetNativeArgumentString',
'Invoke-ExternalCommand',
'Resolve-BakNRetCompressionTool',
'Get-Optimized7zArgument',
'Split-BakNRetToken',
'Remove-BakNRetQuote',
'Test-BakNRetMarker',
'ConvertFrom-BakNRetPatternList',
'ConvertFrom-BackupListLine',
'Test-BakNRetLiteralPath',
'Get-BakNRetRegexExclude',
'Get-BakNRetExcludeArgument',
'Split-BakNRetPatternScope',
'Merge-BakNRetExcludeArgument',
'Resolve-BakNRetCatalogPath',
'Get-BakNRetSoftwareCatalog',
'Find-BakNRetChildDirectoryByName',
'Format-BakNRetCatalogName',
'Expand-CatalogPathText',
'Get-BakNRetArchiveTopLevelNames',
'Get-BakNRetArchiveTopName',
'New-BakNRetArchiveItem',
'New-BakNRetJunction',
'Remove-BakNRetJunction',
'New-BakNRetArchiveStaging',
'Remove-BakNRetArchiveStaging',
'Get-BakNRetItemArchiveName',
'Resolve-BakNRetBackupEntry',
'Write-BakNRetBackupEntryPlan',
'Get-BakNRetBackupBaseName',
'Convert-BakNRetBackupFileNameToPath',
'Get-BakNRetFolderSummary',
'Read-BakNRetManifest',
'Write-BakNRetManifest',
'Sync-BakNRetManifestArchive',
'Move-BakNRetArchiveIntoPlace',
'Enable-BakNRetPrivilege',
'ConvertTo-BakNRetWildcardPattern',
'Test-BakNRetPathExcluded',
'Get-BakNRetAceSignatureList',
'Get-BakNRetSecuritySddlWithStale',
'Get-BakNRetSecurityRecord',
'Test-BakNRetSecurityRecordNeeded',
'Get-BakNRetSecurityRecords',
'Write-BakNRetAtomicText',
'Save-BakNRetSecuritySidecar',
'Read-BakNRetSecuritySidecar',
'Convert-BakNRetSidMap',
'Set-BakNRetObjectSecurity',
'Restore-BakNRetSecurity',
'Get-BakNRetConfig',
'Get-BakNRetPassword'
)
CmdletsToExport = @()
VariablesToExport = @()
AliasesToExport = @()
PrivateData = @{
PSData = @{ Tags = @('Backup', 'Restore', '7zip', 'Windows', 'PSEdition_Desktop', 'PSEdition_Core') }
}
}