WorkflowAndDocuments.psm1
class Server : System.Management.Automation.IValidateSetValuesGenerator { [String[]] GetValidValues() { $servers = (Get-Content -Path $env:ServerList | ConvertFrom-Json).ServerList return $servers } } class Query : System.Management.Automation.IValidateSetValuesGenerator { [String[]] GetValidValues() { $query = (Get-Content -Path $env:ServerList | ConvertFrom-Json).MyQueries return $query } } class Port: System.Management.Automation.IValidateSetValuesGenerator { [String[]] GetValidValues() { $query = (Get-Content -Path $env:ServerList | ConvertFrom-Json).PortList return $query } } <# .SYNOPSIS Call Windchill RV&S Documents .DESCRIPTION Show-Document is using Windchill RV&S Command im viewsegment --hostname host --port port --user userID --query query by using Mksapiviewer.exe --iplocal --xml .NOTES Command is available only over Powershell 7.0 Version .EXAMPLE show-Document -Item 8935655 09:46:17 Section : Category : Reference Mode : ID : 893325655 Document ID : 855935655 Section : 1 Category : Heading Reference Mode : Author ID : 893565623 Document ID : 89335655 Section : 1.1 Category : Heading Reference Mode : Author ID : 893571912 Document ID : 8931565513 Section : 1.1.1 Category : Information Reference Mode : Author ID : 8935849123 Document ID : 8935655213 Section : 1.2 Category : Heading Reference Mode : Author ID : 89315720 Document ID : 893565523 .EXAMPLE show-Document -Item 8935655 -fields id,project,component 09:51:16 ID Project Component -- ------- --------- 8935655 /Windchill/Project System (ID:1234567) 8935656 /Windchill/Project 8935719 /Windchill/Project 8935849 /Windchill/Project 8935720 /Windchill/Project #> function Show-PTCDocument { [CmdletBinding()] param( [Parameter(Mandatory=$true, Position=0)] [ValidateNotNullOrEmpty()] [int]$Item, [Parameter()] [string[]]$Fields, [Parameter()] [string]$asOf, [Parameter()] [ValidateSet([Server])] [String]$Server = $env:PTCSERVER, [Parameter()] [ValidateSet([Port])] [int]$port = $env:PTCPORT ) $cred = Use-Credential -IntegrityAdministrator -asPlainText $param = '--fields=' $customeFields = $null -eq $Fields ? (Out-Null) : [string]::Concat($param,$($fields -join ",")) Write-Debug "Fields:$($customeFields)" $job = Start-Job { mksAPIViewer.exe --iplocal --xml im viewsegment $($args[0]) --user=$($args[1]) --password=$($args[2]) --hostname=$($args[3]) --port=$($args[4]) $args[5] } -ArgumentList $customeFields, $($cred.Username), $($cred.Password), $Server, $port, $Item while($job.state -eq "Running"){ $complet = Get-Random -Minimum 1 -Maximum 99 ; Write-Progress -Activity "Building Document: $($Item)" -PercentComplete $complet} $info = Receive-Job -Job $job $final = Convert-PTCCommand $info switch ($final.Response.ExitCode) { { $_ -ne 0 } { Write-PTCError $final ; break } 0 { $final.Response.Workitems.WorkItem | ForEach-Object { ConvertFrom-PTCXML -entry $_ } ; break } } } <# .SYNOPSIS A short one-line action-based description, e.g. 'Tests if a function is valid' .DESCRIPTION A longer description of the function, its purpose, common use cases, etc. .NOTES Command is available only over Powershell 7.0 Version .LINK Specify a URI to a help page, this will show when Get-Help -Online is used. .EXAMPLE Test-MyTestFunction -Verbose Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines #> function Show-PTCItemHistory { [CmdletBinding()] param ( [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)] [ValidateNotNullOrEmpty()] [string]$Item, [Parameter()] [ValidateSet([Server])] [String]$Server = $env:PTCSERVER, [Parameter()] [ValidateSet([Port])] [int]$port = $env:PTCPORT ) begin { $cred = Use-Credential -IntegrityAdministrator -asPlainText } process { Write-Debug "Current Item:$($Item)" $info = mksAPIViewer.exe --iplocal --xml im viewissue --hostname $server --port $port --user $($cred.username) --password $($cred.password) --showhistory $Item Write-Information "Historic Entry of Item $($item)" $final = Convert-PTCCommand $info switch ($final.Response.ExitCode) { { $_ -ne 0 } { Write-PTCError $final ; break } 0 { $history = $final.Response.WorkItems.WorkItem.Field | Where-Object {$_.name -eq 'MKSIssueHistory'} | Select-Object -ExpandProperty List | Select-Object -ExpandProperty Item ; break } Default {"Unknown Problem"} } $history | ForEach-Object { ConvertFrom-PTCXML -entry $_ } } } <# .SYNOPSIS A short one-line action-based description, e.g. 'Tests if a function is valid' .DESCRIPTION A longer description of the function, its purpose, common use cases, etc. .NOTES Command is available only over Powershell 7.0 Version .LINK Specify a URI to a help page, this will show when Get-Help -Online is used. .EXAMPLE Test-MyTestFunction -Verbose Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines #> function Show-PtcContent { [CmdletBinding()] param ( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [int]$issueID, [Parameter()] [string[]]$fields, [Parameter()] [ArgumentCompleter({get-date -Format "\'MMM dd, yyyy h:mm:ss tt\'"})] [DateTime]$asOf, [Parameter()] [ValidateSet([Server])] [string]$Server = $env:PTCSERVER, [Parameter()] [ValidateSet([Port])] [int]$Port = $env:PTCPORT ) begin { $cred = Use-Credential -IntegrityAdministrator -asPlainText $fieldString = $fields -join "," Write-Debug "Fields:$fieldString" Write-Debug "Date asOf:$asof" } process { $finalObject = [PSCustomObject]@{} $content = switch ($true) { { $null -eq $asOf -and $null -eq $fields } { mksAPIViewer.exe --iplocal --xml im issues --user $($cred.username) --password $($cred.password) --hostname $Server --port $Port $issueID ; break } { $null -ne $fields -and $null -ne $asOf } { $date = $asOf | Get-Date -Format "MMM dd, yyyy h:mm:ss tt" mksAPIViewer.exe --iplocal --xml im issues --user $($cred.username) --password $($cred.password) --asOf $date --fields $fieldString --hostname $Server --port $Port $issueID ; break } { $null -ne $asOf } { $date = $asOf | Get-Date -Format "MMM dd, yyyy h:mm:ss tt" mksAPIViewer.exe --iplocal --xml im issues --user $($cred.username) --password $($cred.password) --asOf $date --hostname $Server --port $Port $issueID ; break } { $null -ne $fields } { mksAPIViewer.exe --iplocal --xml im issues --user $($cred.username) --password $($cred.password) --fields $fieldString --hostname $Server --port $Port $issueID ; break } Default { "Unknown Problem" } } $final = Convert-PTCCommand $content switch ($final.Response.ExitCode) { { $_ -ne 0 } { Write-PTCError $final ; break } 0 { $finalObject = $final.REsponse.Workitems.WorkItem | ForEach-Object { ConvertFrom-PTCXML -entry $_ } $finalObject | Add-Member -NotePropertyName AsOf -NotePropertyValue $date ; break } } Write-Output $finalObject } } <# .SYNOPSIS Call Windchill RV&S Query .DESCRIPTION Invoke-PtcQuery is ussing Windchill RV&S Command im issues --hostname host --port port --user userID --query query by using Mksapiviewer.exe --iplocal --xml .NOTES Command is available only over Powershell 7.0 Version .EXAMPLE Invoke-PtcQuery -query yourQuery -Server Integrity ID Type State Summary -- ---- ----- ------- 12 Project Active Project1 23 Project Active Project2 432 Project Cancelled Project3 2435 Project Cancelled Project4 .EXAMPLE You can specify fields which you want to dislpay. By default if -fields is not specify commands return "ID,Type,State,Summary". Invoke-PtcQuery -query yourQuery -Server Integrity -fields id,'assigned user' ID Assigned User -- ------------- 12 colleagueID1 23 colleagueID2 432 colleagueID3 2435 colleagueID3 #> function Invoke-PtcQuery { [CmdletBinding()] param ( [Parameter(ParameterSetName="Query")] [ValidateSet([Query])] [string]$query, [Parameter(ParameterSetName="QueryDefinition")] [string]$queryDefinition, [Parameter(ParameterSetName="QueryDefinition")] [Parameter(ParameterSetName="Query")] [string[]]$fields, [Parameter(ParameterSetName="QueryDefinition")] [Parameter(ParameterSetName="Query")] [ValidateSet([Server])] [String]$Server = $env:PTCSERVER, [Parameter(ParameterSetName="QueryDefinition")] [Parameter(ParameterSetName="Query")] [ValidateSet([Port])] [int]$port = $env:PTCPORT, [Parameter(ParameterSetName="QueryDefinition")] [Parameter(ParameterSetName="Query")] [switch]$asAdmin, [Parameter(ParameterSetName="QueryDefinition")] [Parameter(ParameterSetName="Query")] [switch]$GUI ) $cred = $asAdmin.IsPresent ? (Use-Credential -IntegrityAdministrator -asPlainText) : (Use-Credential -IntegrityProduction -asPlainText) if($gui.IsPresent) { $asGui = "-g" } $fieldString = $fields -join "," Write-Debug "Server:$($server)" Write-Debug "Port:$($port)" Write-Debug "Fields:$($fieldString)" Write-Debug "Query:$($query)" Write-Debug "Definition:$($queryDefinition)" $content = switch ($true) { {![string]::IsNullOrEmpty($queryDefinition) -and ![string]::IsNullOrEmpty($fields)} { Write-Debug "QueryDefinition + Fields" mksAPIViewer.exe --iplocal --xml im issues --user $($cred.username) --password $($cred.password) $asGui --fields $fieldString --hostname $Server --port $Port --queryDefinition=$queryDefinition ; break } {![string]::IsNullOrEmpty($queryDefinition)} { Write-Debug "QueryDefinition" mksAPIViewer.exe --iplocal --xml im issues --user $($cred.username) --password $($cred.password) $asGui --hostname $Server --port $Port --queryDefinition=$queryDefinition ; break } { ![string]::IsNullOrEmpty($query) -and [string]::IsNullOrEmpty($fieldString) } { Write-Debug "Query" mksAPIViewer.exe --iplocal --xml im issues --user $($cred.username) --password $($cred.password) $asGui --hostname $Server --port $Port --query=$query ; break } { ![string]::IsNullOrEmpty($query) -and ![string]::IsNullOrEmpty($fieldString) } { Write-Debug "Query + Fields" mksAPIViewer.exe --iplocal --xml im issues --user $($cred.username) --password $($cred.password) $asGui --fields $fieldString --hostname $Server --port $Port --query=$query ; break } Default { "Unknown Problem" } } $final = Convert-PTCCommand $content switch ($final.Response.ExitCode) { { $_ -ne 0 } { Write-PTCError $final ; break } 0 { $final.REsponse.Workitems.WorkItem | ForEach-Object { ConvertFrom-PTCXML -entry $_ } ; break } } } <# .SYNOPSIS A short one-line action-based description, e.g. 'Tests if a function is valid' .DESCRIPTION A longer description of the function, its purpose, common use cases, etc. .NOTES Command is available only over Powershell 7.0 Version .LINK Specify a URI to a help page, this will show when Get-Help -Online is used. .EXAMPLE Test-MyTestFunction -Verbose Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines #> function Get-PTCItem { [CmdletBinding()] param ( [Parameter(Mandatory=$true, Position=0,ValueFromPipeline=$true)] [ValidateNotNullOrEmpty()] [int]$Item, [Parameter()] [ValidateSet([Server])] [String]$Server = $env:PTCSERVER, [Parameter()] [ValidateSet([Port])] [int]$port = $env:PTCPORT ) process{ $cred = Use-Credential -IntegrityAdministrator -asPlainText $ItemObj = [PSCustomObject]@{} $ItemView = mksAPIViewer --iplocal --xml im viewissue --showDecorators --showLock --user=$($cred.UserName) --password=$($cred.Password) --hostname=$server --port=$port $Item $Itemraw = $ItemView.replace('<?xml version="1.1" ?>','<?xml version="1.0" ?>') [xml]$Itemxml = $Itemraw switch ($Itemxml.Response.ExitCode) { {$_ -eq 0} { $Itemxml.Response.WorkItems.WorkItem.Field | ForEach-Object { $propertyValue = ($null -eq $_.Item.ID -or $_.Item.ID -eq "" ) ? ($_.Value.InnerText) : $_.Item.ID if($null -ne $_.List.item.displayId){ $propertyValue = $_.List.item.displayId } $ItemObj | Add-Member -MemberType NoteProperty -Name $($_.Name) -Value $($propertyValue) } return $ItemObj } Default { Write-Error -Message $ItemView.Response.Exception.Message} } } } <# .SYNOPSIS A short one-line action-based description, e.g. 'Tests if a function is valid' .DESCRIPTION A longer description of the function, its purpose, common use cases, etc. .NOTES Command is available only over Powershell 7.0 Version .LINK Specify a URI to a help page, this will show when Get-Help -Online is used. .EXAMPLE Test-MyTestFunction -Verbose Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines #> function Use-Credential { param ( [Parameter(ParameterSetName = "WindowsAdministrator")] [switch]$WindowsAdministrator, [Parameter(ParameterSetName = "IntegrityAdministrator")] [switch]$IntegrityAdministrator, [Parameter(ParameterSetName = "IntegrityProduction")] [switch]$IntegrityProduction, [Parameter()] [switch]$asPlainText ) $secretVoult = Join-Path -Path $home -ChildPath secretVault.json Write-Debug "Voult:$($secretVoult)" $credentials = Switch ((Test-Path -Path $secretVoult) -eq $false ) { $true { Get-Credential -Message "please Enter Credentials" ; break } $False { switch ($true) { { $WindowsAdministrator.IsPresent } { $credentials = Get-Content -Path $secretVoult | ConvertFrom-Json | Select-Object -ExpandProperty WindowsAdministrator | Select-Object UserName, @{name = "Password" ; Expression = { Convertto-SecureString $_.Password } } New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $credentials.UserName, $credentials.Password ; break } { $IntegrityAdministrator.IsPresent } { $credentials = Get-Content -Path $secretVoult | ConvertFrom-Json | Select-Object -ExpandProperty IntegrityAdministrator | Select-Object UserName, @{name = "Password"; Expression = { Convertto-SecureString $_.Password } } New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $credentials.UserName, $credentials.Password ; break } { $integrityProduction.IsPresent } { $credentials = Get-Content -Path $secretVoult | ConvertFrom-Json | Select-Object -ExpandProperty IntegrityProduction | Select-Object UserName, @{name = "Password"; Expression = { Convertto-SecureString $_.Password } } New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $credentials.UserName, $credentials.Password ; break } Default { "Unknown1 Problem" } } } Default { "Unknown2 Problem" } } return $asPlainText.IsPresent ? ($credentials | Select-Object UserName, @{Name = "Password"; Expression = { ConvertFrom-SecureString $_.Password -AsPlainText } }) : $credentials } <# .SYNOPSIS Register-SecretVault stores user ID and password in encrypted Voult .DESCRIPTION Register-SecretVault Allows to store your user ID and password in encrypted Voult. It's optional to use. WorkfloAndDocuments commands without voult will alywas ask for your user ID and password. .NOTES Command is available only over Powershell 7.0 Version #> function Register-PTCSecretVault { $info = Get-Credential -Message "Integrity Production" $production = $info | Select-Object UserName,@{name="Password";Expression={ ConvertFrom-SecureString $_.Password }} $info = Get-Credential -Message "Integrity Administrator" $Administration = $info | Select-Object UserName,@{name="Password";Expression={ ConvertFrom-SecureString $_.Password }} $info = Get-Credential -Message "Windows Administrator" $Windows = $info | Select-Object UserName,@{name="Password";Expression={ ConvertFrom-SecureString $_.Password}} $voult = @{ "IntegrityProduction"=$production "IntegrityAdministrator"=$Administration "WindowsAdministrator"=$Windows } $voult | ConvertTo-Json | Out-File -FilePath $home\secretVault.json Write-Output "Voult registered under $($home)\secretVault.json" } # /////////////////////////////// Help Functions //////////////////////////// <# .SYNOPSIS Help-function to tranform XML retrived from windchill command into pscustomeobject .DESCRIPTION Output of any Windchill RV&S command by mksapiviewer.exe .NOTES Command is available only over Powershell 7.0 Version .INPUTS System.Xml.XmlElement .OUTPUTS PScustomObject .EXAMPLE Test-MyTestFunction -Verbose Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines #> function ConvertFrom-PTCXML { param( [Parameter()] [System.Xml.XmlElement]$entry ) $EntryObject = [PSCustomObject]@{} $entry.Field | ForEach-Object { switch ($_) { { $_.psobject.Properties.name -contains "List"} { Write-Debug "First Switch" if($null -eq $_.List.Item.ID) { $EntryObject | Add-Member -NotePropertyName $_.name -NotePropertyValue $_.List.value.innertext } else { $EntryObject | Add-Member -NotePropertyName $_.name -NotePropertyValue $_.List.Item.displayID } ;break } { $_.psobject.Properties.name -notcontains "List" } { Write-Debug "Second Switch" if($_.InnerText -eq '') { if($null -eq $_.List.Item.ID) { Write-Debug "Second Switch, first if" $EntryObject | Add-Member -NotePropertyName $_.name -NotePropertyValue $_.Item.displayID } else { Write-Debug "Second Switch, second if" $EntryObject | Add-Member -NotePropertyName $_.name -NotePropertyValue $_.List.Item.displayID } } else { if($_.Item -is [System.Xml.XmlLinkedNode]) { Write-Debug "Second Switch, Node 1" $EntryObject | Add-Member -NotePropertyName $_.name -NotePropertyValue $_.item.displayId } else { Write-Debug "Second Switch, Node 2 $($_)" $EntryObject | Add-Member -NotePropertyName $_.name -NotePropertyValue $_.innertext } } ;break } } } Write-Output $EntryObject } <# .SYNOPSIS Register-PTCDefaultServerInfo allows you to save in server.Json file your default Server hostname,port,queries .DESCRIPTION This Function is required to run as admin prior to use any other Command from WorkflowandDocuments module to save your hostname, port and optional queries for command Invoke-PTCquery .NOTES Command is available only over Powershell 7.0 Version #> function Register-PTCDefaultServerInfo { switch ([bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match "S-1-5-32-544")) { $true { $server = Read-Host -Prompt "Please Enter Default Windchill RV&S Server" $port = Read-Host -Prompt "Please Enter Default Windchill RV&S Port" $allServers = Read-Host -Prompt "Enter List of Servers you would like to use. Server1,Server2" $allports = Read-Host -Prompt "Enter List of ports you would like to use. 1,2,3" if(Test-Path -Path $HOME\server.json) { [System.Environment]::SetEnvironmentVariable("ServerList","$home\server.json",'Machine') [System.Environment]::SetEnvironmentVariable("PTCSERVER",$server,'Machine') [System.Environment]::SetEnvironmentVariable("PTCPORT",$port,'Machine') $DefaultFile = Get-Content -Path $HOME\server.json | ConvertFrom-Json $DefaultFile.DefaultServer = $server $DefaultFile.DefaultPort = $port $DefaultFile.ServerList += $allServers -split "," $DefaultFile.ServerList += $server $DefaultFile.PortList += $allports $DefaultFile.PortList += $port $DefaultFile | ConvertTo-Json | Out-File -FilePath $HOME\server.json Write-Output "Your Server.Json has been updated" Get-Content -Path $HOME\server.json } else { [System.Environment]::SetEnvironmentVariable("ServerList","$home\server.json",'Machine') [System.Environment]::SetEnvironmentVariable("PTCSERVER",$server,'Machine') [System.Environment]::SetEnvironmentVariable("PTCPORT",$port,'Machine') New-Item -Path $HOME\ -Name server.json -ItemType File $DefaultFile = [PSCustomObject]@{ DefaultServer = $server DefaultPort = $port ServerList = $allServers -split "," PortList = $allports -split "," MyQueries = @() } $DefaultFile.ServerList += $server $DefaultFile.PortList += $port $DefaultFile | ConvertTo-Json | Out-File -FilePath $HOME\server.json Write-Output "Your Server.Json has been created" Get-Content -Path $HOME\server.json } ; break } $false { Write-Output "Please Start Powershell as local Admin to set Enviroment Varables required in this module" ; break } Default {"Unknown Problem"} } } <# .SYNOPSIS Small help fucntion to transform Windchill RV&S command into XML .DESCRIPTION A longer description of the function, its purpose, common use cases, etc. .NOTES Command is available only over Powershell 7.0 Version .INPUTS System.Array .OUTPUTS XmlDocument .LINK Specify a URI to a help page, this will show when Get-Help -Online is used. .EXAMPLE $info = mksAPIViewer.exe --iplocal --xml im viewissue --hostname hostname --port port --user userID --showhistory IssueID $final = convert-PTCCommand $info $final xml Response --- -------- version="1.0" Response #> function Convert-PTCCommand { [CmdletBinding()] param ( [Parameter(Mandatory=$true, Position=0)] [ValidateNotNullOrEmpty()] [array]$Command ) $info = $Command.replace('<?xml version="1.1" ?>','<?xml version="1.0" ?>') return [xml]$info = $info } <# .SYNOPSIS Writes Error from Windchill RV&S command .DESCRIPTION Writes Error transforms Windchill RV&S xml into pscustomobject with message & exit code .NOTES Command is available only over Powershell 7.0 Version .EXAMPLE $info = mksapiviewer.exe --iplocal --xml im queriesx --user userID $final = convert-PTCCommand $info Write-PTCError $final Write-PTCError: @{Message=im: Invalid command: queriesx; ErrorType=UnknownCommandException; ExitCode=1} #> function Write-PTCError { [CmdletBinding()] param ( [xml]$Final ) $errorObject = [PSCustomObject]@{} $errorObject | Add-Member -MemberType NoteProperty -name Message -Value ($Final.Response.WorkItems.WorkItem.Exception.Message ?? $Final.Response.Exception.Message) $errorObject | Add-Member -MemberType NoteProperty -name ErrorType -Value ($Final.Response.WorkItems.WorkItem.Exception.class ?? $Final.Response.Exception.Class) $errorObject | Add-Member -MemberType NoteProperty -name ExitCode -Value $Final.Response.ExitCode Write-error $errorObject } function Invoke-PtcQueryDefinition { [CmdletBinding()] param ( [Parameter(Mandatory=$true)] [string]$queryDefinition, [Parameter()] [string[]]$fields, [Parameter()] [ValidateSet([Server])] [String]$Server = $env:PTCSERVER, [Parameter()] [ValidateSet([Port])] [int]$port = $env:PTCPORT, [Parameter()] [switch]$asAdmin ) $cred = $asAdmin.IsPresent ? (Use-Credential -IntegrityAdministrator -asPlainText) : (Use-Credential -IntegrityProduction -asPlainText) mksAPIViewer.exe --iplocal --xml im issues --user $($cred.username) --password $($cred.password) --hostname $Server --port $Port --queryDefinition=$queryDefinition } <# .SYNOPSIS This function checks if a specific document ID is included in the work items of a server. .DESCRIPTION The Test-ForIncludedDocument function queries the specified server for a document ID and checks if it is present among the work items of the server. It provides information about the document ID and any duplicates found. .PARAMETER DocumentID The ID of the document to check. This parameter is mandatory and must be an integer. .PARAMETER Server (Optional) The server hostname to connect to. Defaults to the value of the PTCSERVER environment variable. .PARAMETER Port (Optional) The port number to connect to. Defaults to the value of the PTCPORT environment variable. .OUTPUTS Returns a custom object containing the DocumentID, whether duplicates were found, and the content of the duplicates. .EXAMPLE 1. Get the documents. $DocumentList = (Invoke-PtcQuery -query Admin_IncludedDocs -fields id -asAdmin).id 2. Run: $documentList | Test-ForIncludedDocument -Server hostname -port port | Tee-Object -Path c:\temp\inluded.txt 3. Outcome: DocumentID Duplicate Content ---------- --------- ------- 3705872 False False 3108546 False False 3458841 False False 3460400 False False 3465038 3465038 24872345 3480778 False False 3481745 False False 3481794 False False .EXAMPLE Test-ForIncludedDocument -DocumentID 67890 -Server "myserver" -port 8080 This example checks for the inclusion of the document with ID 67890 on the specified server ("myserver") and port (8080). #> function Test-ForIncludedDocument { [CmdletBinding()] param ( [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)] [ValidateNotNullOrEmpty()] [int]$DocumentID, [Parameter()] [String]$Server = $env:PTCSERVER, [Parameter()] [int]$port = $env:PTCPORT ) begin { $cred = Use-Credential -IntegrityAdministrator -asPlainText } process { $documentObject = [PSCustomObject]@{} $currentDocument = $DocumentID $info = mksAPIViewer.exe --iplocal --xml im viewsegment --fields id --user $($cred.username) --password $($cred.password) --hostname $server --port $port $DocumentID $final = convert-PTCCommand $info if ($final.Response.ExitCode -ne 0) { Write-Output $final.Response.Exception.Message break } switch ($final.Response.WorkItems.WorkItem.segment -contains $currentDocument) { $true { $duplicate = $final.Response.WorkItems.WorkItem | Where-Object { $_.Segment -eq $currentDocument } $documentObject | Add-Member -NotePropertyName DocumentID -NotePropertyValue $currentDocument $documentObject | Add-Member -NotePropertyName Duplicate -NotePropertyValue $duplicate.segment $documentObject | Add-Member -NotePropertyName Content -NotePropertyValue $duplicate.id $documentObject break } $false { $segmentsFound = "" $segmentsFound += $final.Response.WorkItems.WorkItem.segment | Where-Object { $null -ne $_ } $documentObject | Add-Member -NotePropertyName DocumentID -NotePropertyValue $currentDocument $documentObject | Add-Member -NotePropertyName Duplicate -NotePropertyValue $false $documentObject | Add-Member -NotePropertyName Content -NotePropertyValue $false $documentObject break } Default { "Something went Wrong" } } } } Export-ModuleMember -Function ConvertFrom-PtcXML,Invoke-PtcQuery,Show-PtcDocument,Show-PtcContent,Show-PtcItemHistory,Register-PtcDefaultServerInfo,Convert-PtcCommand,Use-Credential, Get-PtcItem,Register-PtcSecretVault,Write-PTCError,Test-ForIncludedDocument |