当我的命令的第一个字是展开的变量时出现Powershell错误
我想测试一个我正在编写的powershell脚本,它包含一个带有我不希望实际发生的副作用的命令 在bash中,我可以写作当我的命令的第一个字是展开的变量时出现Powershell错误,powershell,Powershell,我想测试一个我正在编写的powershell脚本,它包含一个带有我不希望实际发生的副作用的命令 在bash中,我可以写作 > DO_OR_ECHO=$([ "$MY_DEBUG_FLAG" ] && echo 'echo' || echo) > $DO_OR_ECHO my_dangerous_command args 但尝试在powershell中执行类似的构造似乎不起作用,即使我硬编码了它 > $DO_OR_ECHO='echo' > $DO_O
> DO_OR_ECHO=$([ "$MY_DEBUG_FLAG" ] && echo 'echo' || echo)
> $DO_OR_ECHO my_dangerous_command args
但尝试在powershell中执行类似的构造似乎不起作用,即使我硬编码了它
> $DO_OR_ECHO='echo'
> $DO_OR_ECHO my_dangerous_command args
Unexpected token 'my_dangerous_command' in expression or statement.
我做错了什么?有更好的方法吗?我想要一个基于布尔值的构造,它可以执行命令,也可以简单地打印命令(这样我就可以看到将执行的内容)。使用函数:
然后按如下方式调用它:
doOrEcho my_dangerous_command args
限制:
- 仅适用于对外部程序的调用,而不是对PowerShell cmdlet或函数的调用
- 将数组的元素(
)作为单个参数传递给外部程序是一种称为;有关更多信息,请参阅,其中还注意了一个一般性警告,即空字符串不能按原样作为参数传递,无论是直接传递还是作为用于散点的数组的一部分传递$cmdArgs
- 将数组的元素(
- 在Bash解决方案中,回显命令不会反映扩展参数的原始和/或必要引用,因此参数边界可能会丢失
要演示它(使用对PowerShell Core中的
ls
Unix实用程序的调用):
指出PowerShell有一个功能,其目的是预览操作而不实际执行操作 但是,
-WhatIf
不是当前任务的正确解决方案:
- 只有cmdlet和高级函数才能实现此参数(基于PowerShell提供的功能)-实现此参数需要比上述简单函数付出更多的努力
的目的是显示命令将对哪些数据进行操作/对系统进行哪些更改,而上述功能的目的是回显命令本身-WhatIf
- 例如,
会显示如下内容:Remove Item foo.txt-WhatIf
假设:在目标“C:\tmp\foo.txt”上执行“删除文件”操作。
- 例如,
- 在本用例中,虽然您在技术上仍然可以使用
,但您必须使用-WhatIf
临时打开回音(-WhatIf
)或者将doOrEcho-WhatIf…
首选项变量设置为$WhatIfPreference
,但这样做会影响设置变量时支持$true
的所有cmdlet和函数;此外,-WhatIf
输出冗长,如上所示-WhatIf
可以说,PowerShell的通用命令调用cmdlet
Invoke Command
,应该支持上述函数中的-WhatIf
,但它不支持。而不是尝试在$Var中运行cmdlet,只需使用andif
structure来测试触发器$Var的值。试试“cmd/c echo”。你到底想做什么?在powershell中可能有比依赖深奥的语法/行为更好的方法。看起来您缺少了调用运算符(&)。我不想只使用if,因为我不想不运行它,我还希望运行的内容得到响应。这也是为什么$DO_或_ECHO&my_danger_命令不能满足我的要求。为什么不在powershell中使用cmdletbinding和support-whatif以更合适的方式执行此操作?这就是它存在的原因。@KoryGill:值得一提的是-WhatIf
,但它不是适合这项工作的工具-请参阅我的更新。将参数分散不是更好的方法吗?大概它会适当地引用它们,例如,&$cmd@cmdArgs
良好的反馈,如果不了解总体问题的更多信息,就很难知道总体上的最佳设计。@不可纠正的是1:你是对的,在这里它是更好的选择(答案已更新),尽管它只会对-%
产生影响,不涉及引用-请参阅我刚刚添加到答案的底部部分。
doOrEcho my_dangerous_command args
# Default behavior: *execute* the command.
PS> doOrEcho ls -1 $HOME
# ... listing of files in $HOME folder, 1 item per line.
# With debug flag set: only *echo* the command, with arguments *expanded*
PS> $MY_DEBUG_FLAG = $true; doOrEcho ls -1 $HOME
ls -1 /home/jdoe # e.g.