首页 > 解决方案 > 调用表达式的替代方案

问题描述

我有这个功能:

function traced()
{
    write-host "$args"
    invoke-expression -Command "$args"
}

我在几个地方使用它,traced cp "$($_.FullName)" (join-path $directory $newfile)这样我就有了所有被复制(或删除,或其他)地方的日志

但是当目录包含空格和破折号时,它会导致调用表达式抛出。

我想我可以定义traced-cpand traced-rm,但是如果我有很多要跟踪的函数,那么通用答案是什么?我只想要一个打印,然后评估它给出的确切命令的函数。据我了解,&操作员不是我想要的——它不适用于 shell 内置。

标签: powershell

解决方案


考虑使用参数 splatting 来构建您的命令,而不是使用Invoke-Expression. 我也不知道您在哪里听说过&不适用于 shell 内置程序,但它适用于命令和 cmdlet。

这是有关在 Powershell 中溅射的 Microsoft 官方文档。

这种方法还消除了正确制作命令字符串、必须转义字符和处理路径空格的困难——使用带有命名或位置参数的喷溅可以为您解决大部分问题。


推荐阅读