2017-04-26 3 views
0

Ich versuche, ein Skript zu schreiben, das alte Warteschlangen von Benutzern HKLM entfernen wird (wird schließlich von HKCU löschen, indem Sie ntuser.dat installieren, aber ich bin noch nicht da).Powershell-Fehler mit else-Anweisung

Das Problem, das ich habe ist, dass ich nur durch einen sid unter SOFTWARE \ Microsoft \ Windows NT \ Currentversion \ Print \ Providers \ Client Side Rendering Print Provider \ bin Iterieren und ich erhalte die folgende Fehlermeldung:

Der Begriff "else" wird nicht als Name eines Cmdlets, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder überprüfen Sie, ob der Pfad korrekt ist, und überprüfen Sie, ob der Pfad corr ect ist, und versuchen Sie es erneut.

Ist schon einmal jemand auf dieses Problem gestoßen?

#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

Sie haben die richtige Anzahl von geschweiften Klammern, aber eine ist an der falschen Stelle. Es ist schwer zu sagen, dass ich nach einer kurzen Überprüfung den Einzug ein wenig aufräumen und sicherstellen würde, dass alle zusammenpassen, wo man sie erwartet. Ein Hinweis darauf, dass dies der Fall ist, ist, dass ISE "sonst" in einer anderen Farbe hervorhebt, und der Fehler ist im Grunde gesagt: "Es gibt eine andere Aussage, wo ich keine erwartet habe". –

Antwort

1

Sie haben eine zusätzliche geschweifte Klammer auf der Leitung 153. Wenn Sie nach der Linie 165 bewegen, dass es funktionieren soll, obwohl ich es jetzt nicht testen kann. Ich habe es mir angewöhnt, meine "Wenn-sonst-Aussagen" systematisch zusammenzufassen, um sicherzustellen, dass sie alle miteinander übereinstimmen.

+0

Danke! Dieses Stück funktioniert. Ich versuche jetzt, die gefundenen 2003 Schlüssel zu löschen und folgendes funktioniert nicht: $ strkeytodelete = '"hklm: \" + $ strPrinterPath + "\\" + $ _' #lösche 2003 Schlüssel Remove-Item -Path $ strkeytodelete Es wirft Remove-Item: Kann Laufwerk nicht finden. Ein Laufwerk mit dem Namen "hklm" existiert nicht. Was ist falsch mit meiner Logik dort? –

+1

Entfernen Sie die einfachen Anführungszeichen. Sie machen es eine literale Zeichenfolge und sind auch nicht erforderlich. –

+0

Angenommen, Sie die einfachen Anführungszeichen behoben, versuchen Ändern Sie dies zu: Registry :: hklm – Nick