2017-06-22 68 views
0

如果您的谷歌为PowerShell Imp,您当前会在列表的顶部找到VBScript-to-Windows PowerShell Conversion Guide。然而,答案是很大的技术帮助:转换VBScript的Imp运算符

进出口经营

定义:对两个表达式的逻辑含义。

我们对Imp运算符有什么了解?有两件事:1)它在Visual Basic .NET中不受支持,2)我们从来没有听说过任何人使用它。因此,我们要说的是,是否有Windows PowerShell等价物并不重要。

事实上,我在VBScript中多次使用了Imp运算符(也写为:A→B),如果它存在的话,可能会在PowerShell中使用它。

例1

我想复制不隐藏,除非它被设置为存档(它也需要被复制)的任何文件。
的命令为这将是这样的:

If (($File.Attributes -match "Hidden") -imp ($File.Attributes -match "Archive")) {Copy $File} 

实施例2

我有一个小命令Log-EntryLog-Debug别名。类似于本地Write-Host/Write-Debug函数;当使用Log-Debug别名时,不提供信息但只在提供公共-Debug时记录。 的命令为这个本来是这样的:

If (($Noun -eq "Debug") -imp $MyInvocation.BoundParameters.Debug.IsPresent) {Add-content $LogFile $$Entry} 

如何建立用最少的代码逻辑蕴涵算?

回答

0

如果你把定义安静字面上看,你可能会来像一个逻辑蕴涵声明:

If ($Expression1) {If ($Expression2) {DoThis}} Else {DoThis} 

,因为你需要执行相同功能的两次可能得到安静的过度。 所以,最好是有一个单一如果条件作为替换为VBScript的Imp运营商这让我想出了:

If (($True, [Bool]$Expression2)[[Bool]$Expression1]) {...} 

不过有点进一步的调查使我甚至对VBScript的小鬼一个更简单的更换运营商:


If (!$Expression1 -or $Expression2) {...} 

检查

0..3 | ForEach { 
    $Expression1, $Expression2 = [Int]($_/2), [Int]($_ % 2) 
    New-Object PSObject -Property @{ 
     Expression1 = [Bool]$Expression1 
     Expression2 = [Bool]$Expression2 
     Implication = !$Expression1 -or $Expression2 
    } 
} | Format-Table -AutoSize 

真值表

Expression1 Expression2 Implication 
----------- ----------- ----------- 
     False  False  True 
     False  True  True 
     True  False  False 
     True  True  True 

注:在这个解决方案$Null表达被认为是$False。这与VBScript Imp实现不同,但与包含$Null表达式的其他PowerShell运算符一致。例如VBScript语句:If 1 And vbNull Then msgbox "True" Else msgbox "False",返回True,其中PowerShell语句If (1 -And $Null) {"True"} Else {"False"}返回False

按位

如果你找的是按位Imp操作(这或许应该被称为 - bImp,如果它存在),那么这将是:

$Implication = -bNot Expression1 -bOr Expression2 # e.g.: -bNot 3 -bOr 5 = -3 (-bAnd 0xF = 13)