如何让PowerShell中运行的cmd comp命令静默执行?
解决PowerShell中运行comp命令卡在“Compare more files”提示的问题
问题分析
- cmd空设备名称错误:你脚本里用了
> null,但cmd的空设备是nul,不是null,这会导致FC命令实际创建了一个名为null的文件,而非静默丢弃输出。 - PowerShell与cmd管道的差异:在PowerShell中直接用
cmd.exe /c "echo N | comp ..."时,PowerShell会优先解析管道,导致echo N的输出没有正确传递给cmd环境内的comp命令,从而触发“Compare more files”的交互提示。
解决方案
方案1:修正空设备并让cmd自行处理管道
将完整的cmd命令用单引号包裹,让cmd内部处理管道逻辑,同时把null改为nul:
$LastExitCode = 99 $sItem_1 = "C:\temp\file 1.txt" $sItem_2 = "C:\temp\file 2.txt" Write-Output "Do FC:" cmd.exe /c "FC /b ""$sItem_1"" ""$sItem_2"" > nul" Write-Output $LastExitCode $LastExitCode = 99 Write-Output "Do comp:" cmd.exe /c 'echo N | comp "'$sItem_1'" "'$sItem_2'" > nul' Write-Output $LastExitCode
也可以用双引号转义的写法:
cmd.exe /c "echo N | comp ""$sItem_1"" ""$sItem_2"" > nul"
方案2:通过PowerShell管道传递输入
直接用PowerShell的管道把"N"传递给cmd中的comp命令,绕开cmd内部管道的解析问题:
$LastExitCode = 99 $sItem_1 = "C:\temp\file 1.txt" $sItem_2 = "C:\temp\file 2.txt" Write-Output "Do FC:" cmd.exe /c "FC /b ""$sItem_1"" ""$sItem_2"" > nul" Write-Output $LastExitCode $LastExitCode = 99 Write-Output "Do comp:" Write-Output "N" | cmd.exe /c "comp ""$sItem_1"" ""$sItem_2"" > nul" Write-Output $LastExitCode
方案3:使用PowerShell原生文件比较(替代comp/FC)
如果不需要依赖cmd的命令,直接用PowerShell原生方法更符合脚本习惯:
$file1Hash = Get-FileHash -Path $sItem_1 -Algorithm SHA256 $file2Hash = Get-FileHash -Path $sItem_2 -Algorithm SHA256 if ($file1Hash.Hash -eq $file2Hash.Hash) { Write-Output "文件相同,ExitCode: 0" $LastExitCode = 0 } else { Write-Output "文件不同,ExitCode: 1" $LastExitCode = 1 } Write-Output $LastExitCode
关键说明
nul是cmd环境的空设备,用于丢弃命令输出;PowerShell中对应的是$null,但调用cmd命令时必须用nul。- PowerShell管道与cmd管道逻辑不同,若要在cmd内使用管道,要么让cmd自行解析完整命令字符串,要么通过PowerShell管道直接传递输入。
内容的提问来源于stack exchange,提问作者NewSites
相关产品推荐
相关产品推荐

