PowerShell创建日志文件后Start-Job终端输出变冗长问题求解
问题根因
你遇到的输出格式差异问题是PowerShell的自动格式化机制导致的,两处未处理的输出项共同引发了该问题:
CreateLogFile函数中调用New-Item时,会默认返回新建文件的FileInfo对象,你没有捕获该返回值,导致它直接输出到终端。Start-Job命令执行时会默认返回Job对象,你同样没有捕获该返回值,也会直接输出到终端。
当你不创建日志文件时,终端连续输出的都是同类型的Job对象,PowerShell会自动用紧凑的表格格式渲染,就是你看到的简洁输出。
当你创建日志文件时,终端第一个输出的是FileInfo类型对象,后续输出的Job对象和前者类型不匹配,PowerShell找不到兼容的表格格式,就会自动降级为全属性的列表格式渲染,也就是你看到的冗长输出。
解决方法
1. 屏蔽不需要输出到终端的命令返回值
把所有不需要展示在终端的命令返回值全部捕获,避免输出到终端干扰格式:
- 修改
CreateLogFile中的New-Item调用,屏蔽返回值:
# 两种方式二选一即可 # 方式1:赋值给$null $null = New-Item -Path $logpath -Name $logname -ItemType "file" # 方式2:管道到Out-Null New-Item -Path $logpath -Name $logname -ItemType "file" | Out-Null
- 修改
Start-Job调用,屏蔽返回值:
$null = Start-Job -Name $id -ArgumentList $SubPath,$FileType,$Test -ScriptBlock { # 原有脚本块内容保持不变 }
2. (可选)修复日志路径不匹配的问题
你当前代码存在逻辑BUG:CreateLogFile生成了带时间戳的独立日志文件,但后续写日志都是写入硬编码的固定路径H:\Scripts\Log Files\Drive Clean-Up.log,无法实现「每次运行生成单个日志文件」的预期,修改方式如下:
- 修改
CreateLogFile返回生成的日志路径:
Function CreateLogFile { $date = get-date -Format "dd-MM-yyyy HH-mm" $logname = "Drive Clean-up Log " + $date + ".log" $logpath = "H:\Scripts\Log Files\" $logfile = Join-Path $logpath $logname $null = New-Item -Path $logpath -Name $logname -ItemType "file" -Force return $logfile }
- 在
Clean-DrivesParallel中接收返回的日志路径,替换原有硬编码:
# 替换原来的 CreateLogFile 和 $logfile = "H:\..." 两行 $logfile = CreateLogFile
3. (可选)优化日志写入格式
如果任务执行结果较多,Receive-Job返回的集合直接传入Write-Log会被拼接为单行,可加Out-String保留原有输出格式:
Write-Log -Message (Receive-Job -Name $job | Out-String) -logfile $logfile
内容的提问来源于stack exchange,提问作者Battery_Smooth
相关产品推荐
相关产品推荐

