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

PowerShell脚本调用dd.exe失败,命令行单独执行正常问题求助

问题原因

你脚本里的错误在于用**点运算符(.)**执行拼接好的命令字符串。点运算符的作用是加载脚本或模块,而非解析并执行包含调用运算符(&)的命令字符串。当你把带&和引号的整个字符串传给点运算符时,PowerShell会把它当作完整的命令名去查找,自然找不到对应程序,所以报错。

修复方案

方案1:替换点运算符为Invoke-Expression

把.换成Invoke-Expression(或缩写iex),让PowerShell解析并执行命令字符串:

$DiskDrives = Gwmi Win32_diskdrive | select DeviceID,BytesPerSector,Index,Caption,InterfaceType,Size,TotalSectors,SerialNumber | Out-GridView -OutputMode Multiple -Title 'Select Source Drive(s)'
$BaseOutputPath = 'D:\'
$DiskDrives | %{ Invoke-Expression ('& "C:\Program Files\Git\usr\bin\dd.exe" if={0} of={1} bs=1M' -f $_.DeviceID, (Join-Path $BaseOutputPath "$($Env:ComputerName)$($_.Index).img")) }

注意:Invoke-Expression存在代码注入风险,若输入不可信需谨慎使用,但这里是你自行选择的磁盘,风险可控。

方案2:更安全的参数拆分方式(推荐)

避免拼接命令字符串,直接调用exe并传递参数,符合PowerShell最佳实践,也更安全可靠:

$DiskDrives = Get-WmiObject Win32_diskdrive | Select-Object DeviceID,BytesPerSector,Index,Caption,InterfaceType,Size,TotalSectors,SerialNumber | Out-GridView -OutputMode Multiple -Title 'Select Source Drive(s)'
$BaseOutputPath = 'D:\'
$ddExePath = "C:\Program Files\Git\usr\bin\dd.exe"

$DiskDrives | ForEach-Object {
    $outputFileName = "$($Env:ComputerName)$($_.Index).img"
    $outputFilePath = Join-Path -Path $BaseOutputPath -ChildPath $outputFileName
    & $ddExePath "if=$($_.DeviceID)" "of=$outputFilePath" "bs=1M"
}

这里用Join-Path处理路径拼接更稳妥,直接通过&调用exe并传递参数数组,既避免了字符串解析问题,也更易维护。

额外说明

单独执行命令时能正常运行,是因为控制台会直接解析&运算符,将其作为调用命令的标记;但脚本里用点运算符包裹整个字符串时,PowerShell不会解析其中的&,而是把所有内容当作一个命令名,因此出现找不到命令的错误。

内容的提问来源于stack exchange,提问作者Thiago Souza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:08:13