2016-02-07 19 views
0

我正在寫一個PowerShell腳本,如果它尚未加載,則會加載程序集。我給這家在C#中的邏輯是以下幾點:如何使用C#編寫try-get函數?

void DoSomething(string assemblyFilePath) 
{ 
    string name = Path.GetFileNameWithoutExtension(assemblyFilePath); 

    Assembly assemblyObject; 
    if (!TryGetAssembly(name, out assemblyObject)) 
    { 
     assemblyObject = LoadAssemblyFrom(assemblyFilePath); 
    } 

    // Do something with assemblyObject. 
} 

我試着翻譯成PowerShell中,但它不工作了這麼遠。這裏是我的進步:

function TryGet-Assembly($assembly, [ref] $cached) 
{ 
    $domain = [AppDomain]::CurrentDomain 

    foreach ($reference in $domain.GetAssemblies()) 
    { 
     # GetName() has a type of AssemblyName, 
     # so we need to use GetName().Name to get a string 
     $name = $reference.GetName().Name 
     if ($name -eq $assembly) 
     { 
      $cached = $reference 
      return $true 
     } 
    } 

    return $false 
} 

function Get-Namespaces($assembly) 
{ 
    # Load the assembly, or retrieve it if it's cached 
    $name = [IO.Path]::GetFileNameWithoutExtension($assembly) 
    if (-not TryGet-Assembly $name $assemblyObject) 
    { 
     $assemblyObject = Load-Assembly $assembly 
    } 

    # Do the actual work 
    $types = $assemblyObject.GetTypes() 
    return $types | ? IsPublic | select Namespace -Unique 
} 

出於某種原因,我似乎在PowerShell嘗試運行腳本時出現語法錯誤。這裏是輸出:

At C:\Users\James\Code\csharp\Shims.Xaml\generate.ps1:83 char:13 
+  if (-not TryGet-Assembly $name $assemblyObject) 
+    ~ 
Missing expression after unary operator '-not'. 
At C:\Users\James\Code\csharp\Shims.Xaml\generate.ps1:83 char:14 
+  if (-not TryGet-Assembly $name $assemblyObject) 
+    ~~~~~~~~~~~~~~~ 
Unexpected token 'TryGet-Assembly' in expression or statement. 
At C:\Users\James\Code\csharp\Shims.Xaml\generate.ps1:83 char:14 
+  if (-not TryGet-Assembly $name $assemblyObject) 
+    ~~~~~~~~~~~~~~~ 
Missing closing ')' after expression in 'if' statement. 
At C:\Users\James\Code\csharp\Shims.Xaml\generate.ps1:80 char:1 
+ { 
+ ~ 
Missing closing '}' in statement block or type definition. 
At C:\Users\James\Code\csharp\Shims.Xaml\generate.ps1:83 char:51 
+  if (-not TryGet-Assembly $name $assemblyObject) 
+             ~ 
Unexpected token ')' in expression or statement. 
At C:\Users\James\Code\csharp\Shims.Xaml\generate.ps1:91 char:1 
+ } 
+ ~ 
Unexpected token '}' in expression or statement. 
    + CategoryInfo   : ParserError: (:) [], ParseException 
    + FullyQualifiedErrorId : MissingExpressionAfterOperator

爲什麼會發生這種情況,我該如何解決這個問題?

+0

你爲什麼不向我們展示你在C#中編寫的'TryGetAssembly'? – poke

+0

這就是說,對於你的語法錯誤,你需要在'-not'的操作數週圍加上括號。 – poke

+0

@poke太棒了,謝謝!這解決了它。 –

回答

1

由於函數調用通常在PowerShell中沒有括號,這具有不幸的效果,即運算符優先級不像其他語言那樣有用。

尤其是-not(或!)運營商通常要求你包的操作完全括號內:

if (-not (TryGet-Assembly $name $assemblyObject)) 

或用備用別名!-not

if (!(TryGet-Assembly $name $assemblyObject)) 

我個人比較喜歡但明確的-not,因爲它是更加可見的那些括號之間。