PowerShell
Edit|Remove
#Get input 
param 
( 
    [string]$action 
) 
 
function PrintUsage()  
{ 
    write-host "" 
    write-host "Usage: .\EnableOrDisablePersonsExtraction.ps1 -action [enable|disable]" 
    write-host "  Parameters:" 
    write-host "    action        – sets if persons extraction should be enabled or disabled" 
    write-host "" 
} 
 
# Log level to color mapping 
$lc = @{ 
    VERBOSE="green"; 
    WARNING="yellow"; 
    ERROR="red"; 
    MESSAGE="blue"; 
} 
function log([string] $level, [string] $message) { 
    $date = get-date -uformat "%G-%m-%d %T" 
    write-host "[$date] " -nonewline 
    write-host -foregroundcolor $lc[$level$level.padright(7) -nonewline 
    write-host " $message" 
} 
 
function ValidateInput() 
{ 
    $conf = [xml](Get-Content "$FAST\etc\hostconfiguration.xml") 
    $conf = $conf.properties.property 
    $adminserver = ($conf | Where-Object { $_.name -eq "adminserver" })."#text" 
    $myname = ($conf | Where-Object { $_.name -eq "hostname" })."#text" 
    if ($myname -ne $adminserver) 
    { 
        log ERROR "This script can only be run at $adminserver" 
        exit 1 
    } 
         
    if ($action -eq "") 
    { 
        PrintUsage 
        log ERROR "-action parameter is missing" 
        exit 1 
    } 
    if (!($action -eq "enable" -or $action -eq "disable")) 
    { 
        PrintUsage 
        log ERROR "-action parameter contains an invalid value. Valid values are [enable|disable]" 
        exit 1 
    } 
} 
 
function EnableOrDisablePersonsExtractionRemote() 
{ 
    log VERBOSE "Locating all document processors to load new configuration" 
 
    # Get a list of all nodes in the system 
    $deployment = [xml](Get-Content "$FAST\etc\config_data\deployment\deployment.xml") 
     
    $searchHostList = New-Object System.Collections.ArrayList   
     
    foreach ($h in $deployment.deployment.host | where-object { $_ | get-member -name "document-processor" } | foreach { $_.name })  
    {  
        $idx = $searchHostList.add($h)  
    } 
 
    foreach ($hostName in $searchHostList)  
    {  
        ModifyRemote($hostName) 
    } 
} 
 
function ModifyRemote([string] $nodes) 
{ 
    Foreach ($docproc in $nodes) { 
        log VERBOSE "Modifying person extraction on remote server: $docproc" 
        try { 
            $invocationOutput = @(Invoke-Command -ComputerName $docproc -ArgumentList ($installCommand$scriptFolder$FAST$file$action$docproc-ScriptBlock {  
                param($command$scriptFolder$FAST$file$action$docproc) 
                 
                $lc = @{ 
                    VERBOSE="green"; 
                    WARNING="yellow"; 
                    ERROR="red"; 
                    MESSAGE="blue"; 
                } 
                function log([string] $level, [string] $message) { 
                    $date = get-date -uformat "%G-%m-%d %T" 
                    write-host "[$date] " -nonewline 
                    write-host -foregroundcolor $lc[$level$level.padright(7) -nonewline 
                    write-host " $message" 
                } 
                 
                if ($file.Contains(':')) {  } 
                elseif ($file.StartsWith('\')) { $file = $env:FASTSEARCH + $file.Substring(1)} 
                else { $file = $env:FASTSEARCH + $file } 
                 
                log VERBOSE "($docproc) Reading file: $file" 
                if (test-path $file){ $doc = [xml] (get-content $file) } 
                else 
                { 
                    log ERROR "($docproc) File noe found. Exiting script." 
                    exit 1 
                } 
 
                #Getting the "personnameextraction" node, and setting it to active="no" or active="yes" 
                $node = $doc.SelectSingleNode("/optionalprocessing/processor[@name='personnameextraction']") 
                if ($action -eq "disable") 
                { 
                    $node | Where-Object { $_.active -eq 'yes'| ForEach-Object {$_.active = 'no'} 
                    log VERBOSE "($docproc) Disabled person name extraction" 
                } 
                elseif ($action -eq "enable") 
                { 
                    $node | Where-Object { $_.active -eq 'no'| ForEach-Object {$_.active = 'yes'} 
                    log VERBOSE "($docproc) Enabled person name extraction" 
                } 
                else {  
                    log ERROR "($docproc) Action has an invalid value: $action" 
                    exit 1 
                } 
                 
                #Saving optionalprocessing.xml 
                $doc.Save($file) 
                log VERBOSE "($docproc) Saving file" 
 
                log VERBOSE "($docproc) Restarting all currently running item processors in the system (nctrl restart procserver_i)" 
                cd $FAST\bin 
                $resetOutput = Invoke-Expression "nctrl status" 
                $counter = 1 
                foreach ($line in $resetOutput) 
                { 
                    if ( $line.Contains("procserver") ) 
                    {  
                        log VERBOSE "($docproc) Restarted procserver $counter" 
                        Invoke-Expression "nctrl restart procserver_$counter" 
                        $counter = $counter + 1  
                    } 
                    elseif ($line.Equals("")) 
                    {  
                        continue  
                    } 
                } 
                 
                if ($action -eq "disable")    { log VERBOSE "($docproc) Finished disabling persons extraction." } 
                elseif ($action -eq "enable") { log VERBOSE "($docproc) Finished enabling persons extraction." } 
                return "successfully" 
            }) 
            $status = $invocationOutput | Where-Object {$_.Contains("successfully")} 
            if ($status) {log VERBOSE "Invocation output: $status" } 
        } catch [System.Management.Automation.ActionPreferenceStopException] { 
            log ERROR "Communication with remote machine: $nodeName was interrupted / remote command failed, giving up. " +  
                "If you saw no error output from the script, please verify script on the node directly, as interpreter errors are not passed in invoke invocation." 
               exit 1 
        } catch { 
            log ERROR "Unknown remoting Failure: $_"  
            exit 1 
        } 
         
        if (!$status) { 
            log ERROR ("Failed to enable/disable persons extraction on $docproc") 
            exit 1 
        }  
         
     }    
} 
 
function EnableOrDisablePersonsExtraction() 
{    
    log VERBOSE "Reading file: $file" 
    if (test-path $file){ $doc = [xml] (get-content $file) } 
    else 
    { 
        log ERROR "File noe found. Exiting script." 
        exit 1 
    } 
 
    #Getting the "personnameextraction" node, and setting it to active="no" or active="yes" 
    $node = $doc.SelectSingleNode("/optionalprocessing/processor[@name='personnameextraction']") 
    if ($action -eq "disable") 
    { 
        $node | Where-Object { $_.active -eq 'yes'| ForEach-Object {$_.active = 'no'} 
        log VERBOSE "Disabled person name extraction" 
    } 
    elseif ($action -eq "enable") 
    { 
        $node | Where-Object { $_.active -eq 'no'| ForEach-Object {$_.active = 'yes'} 
        log VERBOSE "Enabled person name extraction" 
    } 
    else {  
        log ERROR "Action has an invalid value: $action" 
        exit 1 
    } 
     
    #Saving optionalprocessing.xml 
    $doc.Save($file) 
    log VERBOSE "Saving file" 
 
    log VERBOSE "Resetting all currently running item processors in the system (%FASTSEARCH%\bin\psctrl reset)" 
    Invoke-Expression "$FAST\bin\psctrl reset" 
     
    if ($action -eq "disable")    { log VERBOSE "Finished disabling persons extraction." } 
    elseif ($action -eq "enable") { log VERBOSE "Finished enabling persons extraction." } 
     
} 
 
#Main Start 
 
$FAST = "$env:FASTSEARCH" 
if (!$FAST) { 
    log ERROR "Environment variable FASTSEARCH not set, cannot find installation" 
    exit 1 
} 
 
$file = $env:FASTSEARCH + "\etc\config_data\DocumentProcessor\optionalprocessing.xml" 
 
ValidateInput 
$spInstalled = Get-PSSnapin | Select-String FASTSearch 
if (!$spInstalled) 
{ 
    Add-PSSnapin Microsoft.FASTSearch.Powershell  
} 
$FAST = $env:FASTSEARCH 
EnableOrDisablePersonsExtractionRemote 
 
#Main End 
 
 
<# 
.SYNOPSIS 
Enables or disables extraction of persons (Property Extraction). 
 
 
.DESCRIPTION 
The script reads a file (optionalprocessing.xml) and enables or disables extraction of persons in the document processing pipeline on a FS4SP installation. 
Script runs on: FAST search (FS4SP) admin node. 
 
.PARAMETER action 
Specifies if property extraction of persons should be enabled or disabled.  
 
.EXAMPLE 
EnableOrDisablePersonsExtraction -file "etc\config_data\DocumentProcessor\optionalprocessing.xml" -action enable (relative to %FASTSEARCH%) 
 
.EXAMPLE 
EnableOrDisablePersonsExtraction -file "C:\FASTSearch\etc\config_data\DocumentProcessor\optionalprocessing.xml" -action disable 
 
.INPUTS 
None.  You cannot pipe objects to EnableOrDisablePersonsExtraction. 
 
#>
 
SYNOPSIS
    Enables or disables extraction of persons (Property Extraction).

SYNTAX
    C:\Temp\TR14\EnableOrDisablePersonsExtraction.ps1 [[-action] <String>] [<Co
    mmonParameters>]

DESCRIPTION
    The script reads a file (optionalprocessing.xml) and enables or disables ex
    traction of persons in the document processing pipeline on a FS4SP installation.
    Script runs on: FAST search (FS4SP) admin node.
   Enable remote scripting:
   On the all nodes run the following commands:"
       Enable-PSRemoting
       Enable-WSManCredSSP -Role Server
   On admin node, run the following command
       Enable-WSManCredSSP -Role client -DelegateComputer <all nodes>
   Run the script as an administrator:
      PS C:\> .\EnableOrDisablePersonsExtraction.ps1 -action enable

REMARKS
    To see the examples, type: "get-help C:\Temp\TR14\EnableOrDisablePersonsExtraction.ps1 -examples"
    For more information, type: "get-help C:\Temp\TR14\EnableOrDisablePersonsExtraction.ps1 -detailed"
    For technical information, type: "get-help C:\Temp\TR14\EnableOrDisablePersonsExtraction.ps1 -full"