菜鸟科技网

DOS命令竖线符号如何正确使用?

  • 查看文件列表,希望文件名整齐排列。
  • 查看系统环境变量,让变量名和值对齐。
  • 查看网络连接端口,让本地地址和外部地址对齐。

主要有两种方法可以实现:

DOS命令竖线符号如何正确使用?-图1
(图片来源网络,侵删)
  1. 使用 for 循环(适用于 CMD):这是最经典、最通用的方法,不依赖任何外部工具。
  2. 使用第三方工具(如 Column:更简单、更强大的方法,需要提前安装。

使用 for 循环(CMD 内置)

这是在标准的 Windows CMD 环境下实现列对齐的核心方法,其原理是:

  1. 先获取所有条目中最长的那个的长度。
  2. 然后在输出每个条目时,用空格填充到这个最大长度,从而实现对齐。

示例1:对齐文件名

假设你想列出当前目录下的所有 .txt 文件,并让它们整齐地排成一列。

@echo off
setlocal enabledelayedexpansion
:: 1. 设置一个变量来存储最长的文件名长度
set max_len=0
:: 2. 第一遍循环,找出最长的文件名
for %%f in (*.txt) do (
    set "filename=%%~nxf"
    if !filename! gtr !max_len! set "max_len=!filename!"
)
:: 3. 第二遍循环,打印对齐后的文件名
echo Found .txt files:
echo -----------------
for %%f in (*.txt) do (
    set "filename=%%~nxf"
    :: 使用 /A: 开关来启用字符串比较,并计算字符串长度
    set "current_len=0"
    for /l %%i in (1,1,8191) do (
        if "!filename:~%%i,1!"=="" (
            set "current_len=%%i"
            goto :break_length_loop
        )
    )
    :break_length_loop
    :: 计算需要填充的空格数
    set "spaces="
    set /a num_spaces = !max_len! - !current_len!
    for /l %%j in (1,1,!num_spaces!) do (
        set "spaces=!spaces! "
    )
    echo !filename!!spaces!
)
endlocal

代码解释:

  • setlocal enabledelayedexpansion: 启用延迟变量扩展,以便在 for 循环内部正确使用 !var! 语法。
  • for %%f in (*.txt) do (...): 遍历所有 .txt 文件。
  • %%~nxf: 这是一个特殊的修饰符,它会提取文件的“驱动器盘符+路径+文件名+扩展名”。
  • if !filename! gtr !max_len! set "max_len=!filename!": 这行代码在 CMD 中不能直接比较字符串长度,所以我们需要用下面的循环来计算长度。
  • 计算字符串长度:这是一个巧妙的技巧,通过不断截取字符串直到为空,来计算其长度。
  • 填充空格:根据计算出的长度差,动态生成相应数量的空格。
  • echo !filename!!spaces!: 输出文件名,紧接着输出填充的空格。

简化版(适用于短文件名,不计算长度): 如果文件名不长,你可以手动指定一个足够大的 max_len,这样代码会简单很多。

DOS命令竖线符号如何正确使用?-图2
(图片来源网络,侵删)
@echo off
set "max_len=30"
echo Files:
echo -----------------
for %%f in (*.*) do (
    set "name=%%~nxf"
    set "spaces="
    for /l %%i in (1,1,!max_len!) do if not "!name:~%%i,1!"=="" set "spaces=!spaces! "
    echo !name!!spaces!
)

示例2:对齐环境变量

如果你想列出所有环境变量,并让 变量名 对齐。

@echo off
setlocal enabledelayedexpansion
:: 1. 找出最长的变量名长度
set max_var_len=0
for /f "tokens=1 delims==" %%a in ('set') do (
    if "%%a" gtr "!max_var_len!" set "max_var_len=%%a"
)
:: 2. 打印对齐后的变量列表
echo Environment Variables:
echo ---------------------
for /f "tokens=1* delims==" %%a in ('set') do (
    set "var_name=%%a"
    set "var_value=%%b"
    set "spaces="
    set /a num_spaces = !max_var_len! - "!var_name!" 
    for /l %%i in (1,1,!num_spaces!) do (
        set "spaces=!spaces! "
    )
    echo !var_name!=!spaces! !var_value!
)
endlocal

注意:这个例子中的字符串长度计算同样使用了循环,因为在 CMD 中没有直接获取字符串长度的函数。


使用第三方工具(推荐)

手动编写 for 循环比较繁琐,而且容易出错,对于经常使用命令行的用户,安装一个轻量级的第三方工具是更高效的选择。

推荐工具:Microsoft PowerToys 中的 PowerLine

PowerToys 是微软官方出品的一套强大的 Windows 增强工具,其中包含一个名为 PowerLine 的工具(在较新版本中可能已整合或被取代,但其功能强大)。

DOS命令竖线符号如何正确使用?-图3
(图片来源网络,侵删)

或者,你可以使用经典的 Column 工具,很多 Unix/Linux 工具包(如 GnuWin32)中都有它。

GnuWin32 中的 Column 为例:

  1. 安装 GnuWin32

    • 访问 GnuWin32 官网:http://gnuwin32.sourceforge.net/
    • 下载并安装 core 包和 utils 包。
    • 将安装目录下的 bin 文件夹(C:\Program Files (x86)\GnuWin32\bin)添加到系统的 PATH 环境变量中。
  2. 使用 ColumnColumn 工具会自动读取输入,并将其格式化为整齐的列。

示例1:对齐文件列表

# 列出当前目录所有文件,自动对齐
dir /b | column -t

输出效果会非常整洁,无论文件名长短。

示例2:对齐环境变量

# 列出所有环境变量,以等号作为分隔符,自动对齐
set | column -t -s '='
  • -t: 以表格形式输出。
  • -s '=': 指定分隔符为等号 。

示例3:对齐 netstat 输出

# 查看网络连接,对齐本地地址和外部地址
netstat -ano | findstr "LISTENING" | column -t

Column 会自动识别空格作为分隔符,并调整列宽。


PowerShell 中的实现方式

如果你使用的是 PowerShell,实现起来会简单得多,因为它有强大的对象处理能力。

示例1:使用 Format-Table

# 获取所有 .txt 文件,并格式化为表格,自动调整列宽
Get-ChildItem -Filter *.txt | Format-Table -AutoSize

-AutoSize 参数会自动计算每列的最佳宽度。

示例2:使用 Format-Wide 如果你想只显示文件名,并且让它们竖排(每行一个),Format-Wide 非常合适。

# 获取所有 .txt 文件,每行显示一个文件名
Get-ChildItem -Filter *.txt | Format-Wide -Column 1

-Column 1 表示每行只显示一个对象。

示例3:对齐环境变量 PowerShell 的环境变量本身就是对象,所以对齐非常简单。

# 获取所有环境变量,格式化为表格
Get-ChildItem Env: | Format-Table -AutoSize

或者,如果你想和 CMD 的 set 命令输出一样:

# 获取所有环境变量,并格式化为 "Name=Value" 的形式,自动对齐
Get-ChildItem Env: | Format-Table -Property Name, Value -AutoSize
方法 优点 缺点 适用场景
CMD for 循环 无需安装任何软件,Windows 自带 代码复杂,难以维护,处理特殊字符麻烦 临时在 CMD 中使用,或编写简单的批处理脚本
第三方工具 (Column) 功能强大,命令简单,效果完美 需要额外安装软件 经常在命令行工作,追求效率和美观的用户
PowerShell 语法简洁,功能强大,面向对象 需要使用 PowerShell 环境,而非传统 CMD 日常使用 PowerShell 进行系统管理和自动化

对于绝大多数用户来说,强烈建议学习使用 PowerShell,它能更优雅、更简单地解决这类问题,如果你被限制在传统 CMD 环境中,那么安装一个 Column 这样的工具会是巨大的生产力提升。

分享:
扫描分享到社交APP
上一篇
下一篇