如何在PowerShell中去除换行符并将打印机列表转为分号分隔格式
问题:将PowerShell获取的打印机列表转为分号分隔的单行格式
我正在编写新脚本,为方便后续管理,需要把获取到的打印机列表整理成特定格式。执行以下命令:
$PrL = (Get-CimInstance -Class CIM_Printer).Name | Sort-Object
得到的结果是每行一个打印机名称:
Printer01 Printer02 Printer03 Printer04
期望输出为分号分隔的单行格式:
Printer01; Printer02; Printer03; Printer04
我试了几种替换换行符的方法,但要么每个条目末尾多了分号,要么没达到预期效果,也搞不清该用\r、r还是其他转义字符。当前使用PowerShell 5.1.19041.3930,系统是Windows 10 Pro。
尝试过的方法
尝试1
$PrL = (Get-CimInstance -Class CIM_Printer).Name | Sort-Object $PrL2 = ForEach-Object { $PrL -replace '\r', ' '}
尝试2
$PrL = (Get-CimInstance -Class CIM_Printer).Name | Sort-Object $PrL2 = $PrL | ForEach { $_ + "; " } $PrL2 | ForEach { $_ -replace '\r', ' '}
尝试3
$PrL = (Get-CimInstance -Class CIM_Printer).Name | Sort-Object $PrL | ForEach-Object { $_ -replace '\n', " "}
正确解决方案
PowerShell里处理数组转分隔符字符串最简便的方法是用-join运算符,无需替换换行符,直接对数组操作即可:
$PrL = (Get-CimInstance -Class CIM_Printer).Name | Sort-Object $PrL -join "; "
如果要把结果保存到变量中:
$PrL = (Get-CimInstance -Class CIM_Printer).Name | Sort-Object $formattedPrinters = $PrL -join "; "
之前尝试失败的原因
- 尝试1:
ForEach-Object用法错误,直接对整个数组$PrL做替换,且\r不是PowerShell中有效的换行符(PowerShell换行符为n`,Windows系统标准换行是rn),同时未加入所需的分号分隔符。 - 尝试2:每个元素后追加
;会导致最后一个元素末尾多一个多余的分号,后续的替换操作也无法将多个行合并为单行。 - 尝试3:对单个元素替换
\n毫无意义,因为单个打印机名称中不存在换行符,无法实现合并效果。
内容的提问来源于stack exchange,提问作者VarmintLP
相关产品推荐
相关产品推荐

