如何在Powershell中将字符串作为非字符串传递给命令?

时间:2018-09-17 15:47:10

标签: powershell

我试图有条件地向在powershell中调用的命令添加参数。但是,当我尝试时,我的参数将作为字符串传递。我不知道如何将其作为标识符传递。

这是我到目前为止的尝试:

$readParams = $(if ("2".Equals("2")) {"-AsSecureString"})
read-host 'Prompt' $readParams

我得到的输出是:

Prompt -AsSecureString:

我希望能够根据条件设置不同的$readParams。如果条件为真,请执行以下操作:

read-host 'Prompt' -AsSecureString

如果条件为假,则出现以下情况:

read-host 'Prompt'

我只想在程序中写一次read-host

如何动态地指定参数而不将其作为字符串传递而不导致其成为提示的一部分,而不是作为标识符样式参数传递?

3 个答案:

答案 0 :(得分:5)

您要查找的功能称为splatting。它允许您将哈希表呈现给命令并将其解释为参数。

<?php
if(!session_id()) {
  session_start();
}

// Include the required dependencies.
require_once( 'vendor/autoload.php' );

$fb = new Facebook\Facebook([
  'app_id' => 'app_id',
  'app_secret' => 'app_secret',
  'default_graph_version' => 'v2.2',
]);

$helper = $fb->getRedirectLoginHelper();

$loginUrl = $helper->getLoginUrl(
    'https://'.$_SERVER['SERVER_NAME'].':444/fb/fb-callback.php',
    array('scope' => 'pages_show_list, manage_pages, publish_pages,         
    user_photos'
));

echo '<a href="' . htmlspecialchars($loginUrl) . '">Log in with Facebook!    
</a>';
echo '<br>'
?>

答案 1 :(得分:2)

如果您想提前准备多个参数,请使用Mike Shepard's helpful answer中所述的 splatting 技术,该技术使用一个哈希表,其哈希表的键名为目标cmdlet的参数,还可以与 switch 参数一起使用(作为有条件地省略以switch参数命名的条目的替代方法,可以无条件地包括该条目,并分配$True以模拟 passing 开关,然后$False模拟省略 [1] )。


要在Jacob Colvin's helpful answer上展开:

对于 switch 参数,例如-AsSecureString(一个不带参数的可选布尔参数),挑战在于,开关的值通常由暗示。 em>存在($True)与它的缺失$False [2]

但是,有 种语法允许通过显式传递值 ,即通过直接将:<expr> 附加到开关名称,其中<expr>是一个表达式,其值转换为布尔值;用自动$True$False变量进行说明:

  • -AsSecureString:$True ...与-AsSecureString
  • 相同
  • -AsSecureString:$False ...通常与未通过 -AsSecureString [1]
  • 相同

因此,您可以直接使用表达式(括在(...)中)来 来解决您的问题,而无需使用aux。变量$readParams

 Read-Host 'Prompt' -AsSecureString:('2' -eq '2')

*显然,在现实生活中,表达式的值不应为不变
* '2' -eq '2'相当于PowerShell的"2".Equals("2"),但请注意,PowerShell的-eq默认情况下不区分大小写 ,因此严格来说,-ceq会成为更接近的模拟。


[1]有时,-SomeSwitch:$False的语义与完全忽略开关完全不同,特别是在优先覆盖优先变量时。例如,如果$VerbosePreference = 'Continue'有效,默认情况下使所有cmdlet产生详细输出,则可以在单个命令上使用-Verbose:$False来抑制它。

[2]严格来说,代表开关参数的cmdlet /高级函数内的参数 variable 的类型为[switch]({ {3}});但是,这种类型的实例实际上就像布尔值。
有点令人困惑的是,与文档中所说的相反,类型的.IsPresent属性反映了开关的有效布尔值(大致来说是打开还是关闭),而不是开关是否被用户明确通过

答案 2 :(得分:1)

您可以根据条件将开关设置为true或false:

$readParams = $(if ("2".Equals("2")) {$true} else {$false})
read-host 'Prompt' -AsSecureString:$readParams