Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我的命令的第一个字是展开的变量时出现Powershell错误_Powershell - Fatal编程技术网

当我的命令的第一个字是展开的变量时出现Powershell错误

当我的命令的第一个字是展开的变量时出现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

我想测试一个我正在编写的powershell脚本,它包含一个带有我不希望实际发生的副作用的命令

在bash中,我可以写作

> 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
    ,但这样做会影响设置变量时支持
    -WhatIf
    的所有cmdlet和函数;此外,
    -WhatIf
    输出冗长,如上所示


可以说,PowerShell的通用命令调用cmdlet
Invoke Command
,应该支持上述函数中的
-WhatIf
,但它不支持。

而不是尝试在$Var中运行cmdlet,只需使用and
if
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.