我尝试使用下面的方法创建虚拟目录,因为我遇到了IIS模块的问题。它每次代理运行时都会创建虚拟目录,因此我的unless语句似乎有问题。有人可以指出我正确的方向吗?
class directories {
$directories = {
'test_dir' => 'virt_dir_path'
}
$directories.each |$k, $v| {
exec { $k:
unless => '$test = Get-WebVirtualDirectory -Site website -Name "${k}";
if ($test -eq $false) {exit 1} else {exit 0}',
command => 'New-WebVirtualDirectory -Site website -Name ${k} -PhysicalPath ${v}',
provider => powershell,
}
}
}
答案 0 :(得分:3)
AFAICS你有2个问题:
${k}
。 $test -eq $false
应始终评估为$false
,因为PowerShell在执行比较操作时会执行一些黑色的mag ^ W ^ Wimplicit类型转换。因此,你需要注意你与什么以及以什么顺序进行比较。
示例:
PS C:\> 'false' -eq $false True PS C:\> $false -eq 'false' False
上面的示例根据操作数的顺序给出不同的结果,因为第二个操作数被隐式转换以匹配第一个操作数的类型。在第一种情况下导致'false' -eq 'false'
,其结果为true,但在第二种情况下,您得到$false -eq $true
(显然评估为false),因为PowerShell在布尔上下文中解释non-empty strings as $true
将您的代码更改为以下内容:
$directories.each |$k, $v| {
exec { $k:
command => "New-WebVirtualDirectory -Site website -Name '${k}' -PhysicalPath '${v}'",
unless => "if (Get-WebVirtualDirectory -Site website -Name '${k}') {exit 0} else {exit 1}",
provider => powershell,
}
}
您也可以制作条件
exit (1 - [int][bool](Get-WebVirtualDirectory -Site website -Name '${k}'))
如果您喜欢具有更多黑客价值的东西。