You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让PowerShell中运行的cmd comp命令静默执行?

解决PowerShell中运行comp命令卡在“Compare more files”提示的问题

问题分析

  1. cmd空设备名称错误:你脚本里用了> null,但cmd的空设备是nul,不是null,这会导致FC命令实际创建了一个名为null的文件,而非静默丢弃输出。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:50:03