2017-04-26 6 views
0

ユーザーから古いキューを削除するスクリプトを作成しようとしています.HKLM(最終的にはntuser.datをマウントしてHKCUから削除しますが、まだありません)。Powershellのelseステートメントでのエラー

私が午前問題は、私は唯一の印刷プロバイダー\レンダリングクライアント側\マイクロソフト\ Windows NTの\ CurrentVersionの\印刷\プロバイダ\ SOFTWARE下で1つのSIDを反復処理していますということであり、私は次のようなエラーメッセージが出ます:

を「else」という用語は、コマンドレット、関数、スクリプトファイル、または実行可能なプログラムの名前として認識されません。名前のスペルを確認するか、パスが含まれている場合は、パスがcorrであることを確認してから を実行して、もう一度試してください。

誰もこの問題に遭遇しましたか?

#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

適切な数の中括弧がありますが、1つは間違った場所にあります。クイックレビューから、あなたのインデントをちょっと整理して、あなたが期待している場所にマッチしているかどうかを確認するのは難しいです。これが問題であるという一つの手がかりは、ISEが別の色で "else"を強調しているということです。エラーは、基本的には "else文がありません"と言っています。 –

答えて

1

あなたがライン165の後に、それが動作する必要があることを移動した場合、私は今それをテストすることはできませんが、あなたは、ライン153上の余分な中括弧を持っています。私はif-elseステートメントを系統的に崩壊させる習慣を覚えて、それらのステートメントがすべて互いに一致するようにします。

+0

ありがとう!その作品は動作しています。私は現在、見つかった2003年の鍵を削除しようとしていますが、以下は動作しません。 $ strkeytodelete = '"hklm:\" + $ strPrinterPath + "\\" + $ _' #delete 2003 Key Remove-Item -Path $ strkeytodelete スローされます Remove-Item:ドライブが見つかりません。 "hklm"という名前のドライブが存在しません 論理が間違っていますか? –

+1

一重引用符を削除していて、リテラル文字列にしてあり、不要です。 –

+0

一重引用符を修正した場合、これを次のように変更します:Registry :: hklm – Nick

関連する問題