PowerShell中Move-Item返回值异常疑问及&&等效语法困惑
问题解释:PowerShell中
-and连接命令返回False但操作成功的原因 核心原因:逻辑运算符-and的工作机制与cmdlet返回值
PowerShell里的-and是布尔逻辑运算符,要求左右两边的表达式都能被解析为布尔值,但Move-Item、Rename-Item这类cmdlet有个关键特性:
- 默认不返回任何输出(即返回
$null) - 在PowerShell的布尔判断规则里,
$null会被判定为$false
你的命令执行流程是这样的:
- 先执行
New-Item,成功创建foo文件夹,同时返回代表该文件夹的DirectoryInfo对象——这个对象在布尔判断里会被视为$true - 因为
-and左边为$true,所以继续执行右边的Move-Item,成功将foo移动为bar,但Move-Item返回$null,被解析为$false - 整个
$true -and $false表达式最终返回$false,但这只是表达式的运算结果,和Move-Item本身执行成功完全是两回事
替代方案:用&&实现类Unix的短路执行
要是你想实现Unix里command1 && command2的效果(只有command1成功才执行command2,且整体返回执行状态),PowerShell 5.1已经原生支持&&运算符:
New-Item -Type Directory -Path foo && Move-Item -Path foo -Destination bar
这个命令的行为:
- 只有
New-Item执行无错误,才会运行Move-Item - 整体返回值取决于最后执行的命令状态:
Move-Item成功就返回$true,失败则返回$false
验证cmdlet返回值的小方法
想确认某个cmdlet的返回值,直接执行后看输出,或者用$?变量查看上一条命令的执行状态:
# 执行Move-Item Move-Item -Path foo -Destination bar # 查看执行成功与否(成功为$true,失败为$false) $? # 要是想让Move-Item返回目标对象,加-PassThru参数 Move-Item -Path foo -Destination bar -PassThru
内容的提问来源于stack exchange,提问作者malat
相关产品推荐
相关产品推荐

