Converting a string to a set of arguments - Powershell

Posted on 2009-05-07
Last Modified: 2012-05-06
I have written a script (see code) to create Dynamic Distribution Groups. I have a function that creates the RecipientFilter and passes it to the New-DynamicDistributionGroup command. Problem is, it sees it as a single argument and not a valid recipient filter. If I copy the newly copy the newly created command to a .ps1 file and then call that file, it works fine, but it simply will not let me run the command from the original script. I know why this is happening, but I dont know how to fix it.

In a nutshell, the Create-Filter function returns $filter, which will look something like (Alias -like *dude*).

It then generates the code:

New-DynamicDistributionGroup -Name $DDG -domaincontroller $dc -OrganizationalUnit $ou -RecipientContainer $rc -RecipientFilter {($RecFilter)}

So, in the above example, it would have RecipientFilter {((Alias -like *dude*))} . The problem is, it does not see (Alias like *dude*) as a valid set of arguments, it sees them as a single property with no arguments attached. Since the (Alias like *dude*) property does not exist, it fails to set it.

If I have it write the command to a new script file instead, (which is the way I have it written right now) and then call the new script, it reads the whole thing in properly and executes it. I guess what I am asking is, is there a way to make it read it as property operator value and not just a property within the script that generated the RecipientFilter?

Function Create-Filter


	$Filter = $null

	$DoMore = "Y"


	While ($DoMore -eq "Y")	



		Write-Host -fore White "The following is a list of common filterable properties:"

		Write-Host -fore Yellow "Alias                          AssistantName     C                     City                  Co"

		Write-Host -fore Yellow "Company                        CountryCode       CustomAttribute(1-15) Database              Department"

		Write-Host -fore Yellow "DisplayName                    EmailAddress      ExternalEmailAddress  ExternalOofOptions    FirstName"

		Write-Host -fore Yellow "HiddenFromAddressListsEnabled  IsLinked          IsMailboxEnabled      IsResource            IsShared"

		Write-Host -fore Yellow "LastName                       Manager           MobileFeaturesEnabled Name                  Office"

		Write-Host -fore Yellow "PostalCode                     RecipientType     RecipientTypeDetails  SamAccountName        ServerName"

		Write-Host -fore Yellow "StateOrProvince                StreetAddress     Title                 UMEnabled             UseerPrincipalName"

		Write-Host -fore White "---------------------------------------------------------------------------------------------------------------"

		Write-Host -fore White "The following is a list of some of the less-common filterable properties:"

		Write-Host -fore Yellow "CommonName                     DistinguishedName ExchangeVersion       ExternalOofOptions    Fax"

		Write-Host -fore Yellow "HiddenGroupMembershipEnabled   HomeMTA           HomePhone             Id                    LegacyExchangeDN"

		Write-Host -fore Yellow "ManagedBy                      MemberOfGroup     Members               MobilePhone           Name"

		Write-Host -fore Yellow "Notes                          Pager             Phone                 PostOfficeBox         PrimarySMTPAddress"

		$Property = Read-Host "Enter the Property you wish to filter on. (Ensure you use the correct spelling as above)"


		Write-Host -fore Yellow "What kind of comparison would you like to do?"

		Write-Host -fore Yellow "Enter 1 for Equals (-eq)"

		Write-Host -fore Yellow "Enter 2 for Does not equal (-ne)"

		Write-Host -fore Yellow "Enter 3 for Like (-like)"

		Write-Host -fore Yellow "Enter 4 for Not Like (-notlike)"

		Write-Host -fore Yellow "Enter 5 for Less Than (-lt)"

		Write-Host -fore Yellow "Enter 6 for Less Than or Equal To (-le)"

		Write-Host -fore Yellow "Enter 7 for Greater Than or Equal To (-ge)"

		Write-Host -fore Yellow "Enter 8 for Greater Than (-gt)"

		$operator = Read-Host "Please select your comparison operator (1, 2, 3, 4, 5, 6, 7, or 8)"


		Write-Host -fore Yellow "What value is the property being compared to?"

		$Value = Read-Host "Enter the value the property is being compared against"

		Switch ($operator)


			1 {$Filter = "$Filter($Property -eq '$Value')"}

			2 {$Filter = "$Filter($Property -ne '$Value')"}

			3 {$Filter = "$Filter($Property -like '*$Value*')"}

			4 {$Filter = "$Filter($Property -notelike '*$Value*')"}

			5 {$Filter = "$Filter($Property -lt '$Value')"}

			6 {$Filter = "$Filter($Property -le '$Value')"}

			7 {$Filter = "$Filter($Property -ge '$Value')"}

			8 {$Filter = "$Filter($Property -gt '$Value')"}


		$More = Read-Host "Would you like to add more to the filter? (Y/N)"

		If ($More -eq "Y")


				Write-Host -fore Yellow "What operator do you wish to use for the next Propery?"

				Write-Host -fore Yellow "Enter 1 for -and"

				Write-Host -fore Yellow "Enter 2 for -or"

				Write-Host -fore Yellow "Enter 3 for -and -not"

				Write-Host -fore Yellow "Enter 4 for -or -not"

				$op = Read-Host "Make your selection (1, 2, 3, or 4)"

				Switch ($op)


						1 {$Filter = "$Filter -and "}

						2 {$Filter = "$Filter -or "}

						3 {$Filter = "$Filter -and -not "}

						4 {$Filter = "$Filter -or -not "}


				$DoMore = "Y"




				return $Filter

				$DoMore = "N"






#This script will create/Update a Dynamic Distribution Group

#$ErrorActionPreference = "SilentlyContinue"

$ou = " Groups"

$DoAgain = "Y"

$Output = "CreateDDG1.ps1"

$Output2 = "UpdateDDG1.ps1"

While ($DoAgain -eq "Y")



	#Choose which Domain Controller to use for your Task

	Write-Host -fore Yellow "Please select a domain controller to process this request:"

	Write-Host -fore Yellow "Enter 4 for"

	Write-Host -fore Yellow "Enter 5 for"

	Write-Host -fore Yellow "Enter 6 for"

	Write-Host -fore Yellow "Enter 7 for"

	Write-Host -fore Yellow "Enter 8 for"

	$DCChoose = Read-Host "Make selection now: (4, 5, 6, 7, or 8)"


	Switch ($DCChoose)


			4 {$DC = ""}

			5 {$DC = ""}

			6 {$DC = ""}

			7 {$DC = ""}

			8 {$DC = ""}


	#Choose whether to create or update a Dynamic Distribution List


	Write-Host -fore Yellow "Do you wish to Create or Update a Dynamic Distribution Group?"

	Write-Host -fore Yellow "Enter 1 to Create a new Dynamic Distribution Group"

	Write-Host -fore Yellow "Enter 2 to Update an Existing Dynamic Distribution"

	$TaskType = Read-Host "Make Selection now: (1 or 2)"


	Write-Host -fore Yellow "What is the name of the Dynamic Distribution Group (DDG)?"

	$DDG = Read-Host "Enter the DDG Name"


	If ($TaskType -eq 1) 


			$err = $null

			Write-Host -fore Yellow "Do you wish to use as your RecipientContainer?"

			$rcyn = Read-Host "Make selection now: (Y/N)"


			If ($rcyn -eq "Y"){$rc = ""}

			Else {$rc = Read-Host "Enter the RecipientContainer: (I.E."}

			Write-Host -fore Yellow "What is the LAN-ID of the Owner of this DDG?"

			$Owner = Read-Host "Enter the LAN-ID of the DDG Owner"

			$mb = get-mailbox $Owner

			$Notes = "Owner = $mb"

			$RecFilter = Create-Filter



			#New-DynamicDistributionGroup -Name $DDG -domaincontroller $dc -OrganizationalUnit $ou -RecipientContainer $rc -RecipientFilter {($RecFilter)}

			$sInput1 = "New-DynamicDistributionGroup -Name '$DDG' -domaincontroller '$dc' -OrganizationalUnit '$ou' -RecipientContainer '$rc' -RecipientFilter {($RecFilter)}"

			$sInput2 = "Write-Host -fore Yellow 'Please stand by while we create $DDG'"

			$sInput3 = "Start-Sleep 10"

			$sInput4 = "Set-DynamicDistributionGroup '$DDG' -DomainController '$dc' -ManagedBy '$Owner' -Notes '$Notes' -RequireSenderAuthenticationEnabled:`$False"

			#Set-DynamicDistributionGroup $DDG -DomainController $dc -ManagedBy $Owner -Notes $Notes -RequireSenderAuthenticationEnabled:$False

			Out-File $output -InputObject "$sInput1"

			Out-File $output -InputObject "$sInput2" -Append

			Out-File $output -InputObject "$sInput3" -Append

			Out-File $output -InputObject "$sInput4" -Append




	ElseIf ($TaskType -eq 2)


			Write-Host -fore Yellow "What would you like to modify?"

			Write-Host -fore Yellow "Enter 1 for Owner"

			Write-Host -fore Yellow "Enter 2 for RecipientFilter"

			Write-Host -fore Yellow "Enter 3 for RecipientContainer"

			$Change = Read-Host "Enter your selection (1, 2, or 3)"

			Switch ($Change)


					1 {

						$err = $null

						Write-Host -fore Yellow "What is the New Owner's LAN-ID?"

						$Owner = Read-Host "Enter the LAN-ID of the DDG's new Owner"

						$mb = get-mailbox $Owner

						$Notes = "Owner =$mb"

						Write-Host -fore Green "Set-DynamicDistributionGroup '$DDG' -DomainController '$dc' -ManagedBy '$Owner' -Notes '$Notes' -RequireSenderAuthenticationEnabled:`$False"

						Set-DynamicDistributionGroup $DDG -DomainController $dc -ManagedBy $Owner -Notes $Notes -RequireSenderAuthenticationEnabled:$False


					2 {

						$err = $null

						$RecFilter = Create-Filter

						$sInput = "Set-DynamicDistributionGroup '$DDG' -DomainController '$dc' -RecipientFilter {($RecFilter)}"

						Out-File $output2 -InputObject "$sInput"


						Write-Host -fore Green "Recipient filter for $DDG is updated."

						#Set-DynamicDistributionGroup $DDG -DomainController $dc  -RecipientFilter {($RecFilter)}


					3 {

						$err = $null

						$rc = Read-Host "Enter the RecipientContainer: (I.E."

						Write-Host -fore Green "Set-DynamicDistributionGroup $DDG -DomainController $dc -RecipientContainer $rc"

						Set-DynamicDistributionGroup $DDG -DomainController $dc -RecipientContainer $rc




	Else { Write-Host -fore Red "Invalid Entry" }


#	Write-Host -fore White "Process returned error code $err"

	$DoAgain = Read-Host "Would you like to work with another Dynamic Distribution Group? (Y/N)"



Open in new window

Question by:GusGallows
1 Comment
LVL 12

Accepted Solution

GusGallows earned 0 total points
ID: 24330363
Nevermind, I figured it out. I have to save the whole command to a variable and then run invoke-expression against it. (iex) See corrected code below.
$sInput1 = "New-DynamicDistributionGroup -Name '$DDG' -domaincontroller '$dc' -OrganizationalUnit '$ou' -RecipientContainer '$rc' -RecipientFilter {($RecFilter)}"

iex $sInput1

Open in new window


Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Lotus Notes – formerly IBM Notes – is an email client application, while IBM Domino (earlier Lotus Domino) is an email server. The client possesses a set of features that are even more advanced as compared to that of Outlook. Likewise, IBM Domino is…
This article aims to explain the working of CircularLogArchiver. This tool was designed to solve the buildup of log file in cases where systems do not support circular logging or where circular logging is not enabled
To show how to generate a certificate request in Exchange 2013. We show this process by using the Exchange Admin Center. Log into Exchange Admin Center.:  First we need to log into the Exchange Admin Center. Navigate to the Servers >> Certificates…
In this Micro Video tutorial you will learn the basics about Database Availability Groups and How to configure one using a live Exchange Server Environment. The video tutorial explains the basics of the Exchange server Database Availability grou…

910 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now