2017-04-26 132 views
0

我正在嘗試編寫一個腳本,它將從用戶HKLM中刪除舊隊列(最終將通過掛載ntuser.dat從HKCU刪除,但我還沒有)。與else語句Powershell錯誤

我遇到的問題是,我只能通過一個SID下SOFTWARE \微軟\的Windows NT \ CURRENTVERSION \打印\提供商迭代\客戶端繪製打印提供商\,我得到了以下錯誤消息:

術語'else'不被識別爲cmdlet,函數,腳本文件或可操作程序的名稱。檢查名稱的拼寫,或者如果包含路徑,請驗證路徑是否爲更正路徑,然後重試。

有沒有人遇到過這個問題?

#defining my object that will be used throughout the script. Will be used to log everything 
$objQueueData=[pscustomobject]@{ 
computername="" 
computerstatus="" 
Registrystatus="" 
SID="" 
Does_It_Have_2003_Queues="" 
User_SID_Status="" 
user="" 
UNC_2003_Queues="" 

} 

#$QueueDataCollection=[pscustomobject]@{ 
#queuecollection=$QueueData 
#} 

#reading the list of workstations 
Get-Content "P:\PowerShell\jm\DeletePrintQueues\Workstations.txt" | ForEach-Object{ 
    $strComputerName = $_ 
    #check if the workstation is up 
    IF (Test-Connection -ComputerName $strComputerName -count 2 -quiet) 
    { 
      #$objUser= Get-ChildItem c:\users 
      #$strUserName=$objUser.Name 
      $objQueueData.computername=$strComputerName 
      $objQueueData.computerstatus="Machine is up" 
      DeleteHklm $strComputerName 
    } 
    else 
    { 
    #We are here because the computer could not be reached 
    Write-Host "Machine down" $strComputerName 
    $objQueueData.computername =$strComputerName 
    $objQueueData.computerstatus = "Machine Down" 
    $objQueueData.Registrystatus ="Machine Down" 
    $objQueueData.SID = "Machine Down" 
    $objQueueData.Does_It_Have_2003_Queues="Machine Down" 
    $objQueueData.User_SID_Status="Machine Down" 
    $objQueueData.user="Machine Down" 
    $objQueueData.UNC_2003_Queues="Machine Down" 
    $objQueueData | Export-Csv P:\powershell\jm\results2.csv -NoTypeInformation -Append 
    }  

} 


function DeleteHKLM { 
    param ([string]$computername) 


    try{ 
      If($strHklm = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$strcomputername)) 
      { 
       #executes when it can open HKLM 
       $objqueuedata.RegistryStatus = "Was able to open the registry" 
       #set the path of the registry 
       $PrinterRegKey = 'SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Providers\\Client Side Rendering Print Provider' 
       #$PrinterRegKey 
       $regPrinterRef = $strHklm.OpenSubKey($PrinterRegKey) 
       #debug 
       Write-Host "regprinterref is: "$regPrinterRef       
      } 

       If($regPrinterRef) 
       { 
       #This executes if there are Printers present in the registry 
       #region Loop thru all child keys. These contain the calculable UNC paths to 2003 
       $regPrinterRef.GetSubKeyNames() | ForEach-Object{ 
       #debug 
       Write-Host "The sid is: " $_ 
       #concatinating to get to the connections key 
       #$PrinterRegKey 
       $strPrinterpath =$PrinterRegKey+"\\"+ $_ + "\\Printers\\Connections" 
       #debug 
       Write-Host "The printer keys for SID are located in: " 
       $strPrinterPath 
        if ($strPrinterpath -notlike "*servers*") 
        { 
         #this value is the sid 
         # $_ will give us the sids. Here I am storing the SIDs into strUserSID to use later on 
         $strUserSID = $_ 
         #debug 
         # $strUserSID  

         # The logic below will convert SID to username 
         #pass the SID to the secrity principal SID being struserSID 
         $objSID = New-Object System.Security.Principal.SecurityIdentifier("$strUserSID") 


         #using a try catch to filter out deleted SIDs, otherwise powershell will throw an error saying it is null 
         Try{ 

          $strUser = $objSID.Translate([System.Security.Principal.NTAccount]).Value 
          $objQueueData.User_SID_Status ="Valid SID" 
          $strUser          

          } 
         Catch{ 
           #$strUserID = $objSID.Value 
           $objQueueData.User_SID_Status ="Invalid SID" 
           $objQueueData.User = "Invalid SID" 
           $objQueueData.Does_it_Have_2003_Queues ="Invalid SID" 
           $objQueueData.UNC_2003_Queues = "Invalid SID" 
           $objQueueData | Export-Csv P:\powershell\jm\results1.csv -NoTypeInformation -Append 
           #exit 

          } 

         $regPrinterDetails = $Strhklm.OpenSubKey($strPrinterPath) 
         $regPrinterDetails.GetSubKeyNames() |ForEach-Object{ 
         #looping through each key at the connections level to search for the 2003 print server names 
          if($_ -like "*sarspprt2*") 
           {        
            $objQueueData.Does_It_Have_2003_Queues = "Yes" 
            #this value is the printer if it exists 
            # $_ will give us the printers. Here I am storing the printers into strUserPrinters to user later on 
            $strUserPrinters = $_ 
            Write-Host "struserprinters value is " $_ 
            #$strUserPrinters 
            $blnHasOldQueues = $true 
            #The code below is to build the printer UNC to make it more legible 
            $intPrinterLength= $strUserPrinters.Length 
            $strPrintServer= $strUserPrinters.Substring(2,10) 
            #Doing the -13 because we have to limit the length of the substring statement to the length minus the starting poistion of the substring 
            $strPrinterShareName =$strUserPrinters.Substring(13,$intPrinterLength-13) 
            $strPrintUNC = "\\"+$strPrintServer+"\"+$strPrinterShareName 
            $objQueueData.UNC_2003_Queues = $strPrintUNC 
            $objQueueData.User = $strUser 
            $objQueueData | Export-Csv P:\powershell\jm\results.csv -NoTypeInformation -Append 
            $strkeytodelete=$strPrinterPath+"\\"+$_ 
            $strkeytodelete 
            #delete 2003 Key 

            Remove-Item -Path '$strkeytodelete' -Recurse              
           } 
           elseif($_ -notlike "*sarspprt2*") 
            { 
             #Write-host "No 2003 Queues Detected" 
             #Write-host "no 2003 Queues detected" $strUserSID,$strUser,$strPrintUNC 
             $objQueueData.User = $strUser 
             $objQueueData.Does_it_Have_2003_Queues = "No 2003 Queues Detected for this user or vsarspprt* queue" 
             $objQueueData.UNC_2003_Queues = "No 2003 Queues Detected for this user or vsarspprt* queue" 
             $objQueueData | Export-Csv P:\powershell\jm\results.csv -NoTypeInformation -Append 

            } 

         # Write-Host $strServer $blnHasOldQueues $strUserSID $strUserPrinters 

        } 

        } 

       } 
         else 
          { 
           #Write-Host "No Printers in the Registry" 
           $objQueueData.computername="" 
           $objQueueData.computerstatus="" 
           $objQueueData.Registrystatus="" 
           $objQueueData.SID="" 
           $objQueueData.Does_It_Have_2003_Queues="" 
           $objQueueData.User_SID_Status="" 
           $objQueueData.user="" 
           $objQueueData.UNC_2003_Queues="" 
          } 
       } 

     } 
    catch{ 
      # Write-Host "cant read registry" 
      $_.Exception.Message 

     } 


} 
+1

你已經得到了正確數量的花括號,但有一個錯誤的地方。很難從快速回顧中分辨出來,我會稍微整理一下你的縮進,並確保它們都符合你的期望。一個線索,這是問題是,ISE突出顯示不同顏色的「其他」,錯誤基本上是說「還有一個我沒有期待的聲明」。 –

回答

1

你對線153額外的大括號如果移動到線165後,它應該工作,雖然我現在不能測試它。我習慣於系統性地摺疊我的if-else語句,以確保它們都與彼此匹配。

+0

謝謝!那件作品正在運作。我現在試圖刪除找到的2003鍵,但以下操作不起作用: $ strkeytodelete ='「hklm:\」+ $ strPrinterPath +「\\」+ $ _' #delete 2003鍵 Remove-Item -Path $ strkeytodelete 它拋出 Remove-Item:找不到驅動器。名稱爲「hklm」的驅動器不存在 我的邏輯有什麼問題? –

+1

刪除單引號,它們使它成爲一個字符串並且也是不必要的 –

+0

假設您修復了單引號,將其修改爲:Registry :: hklm – Nick