1

I think the question has already been asked, despite my various searches, I can't really find the answer.

I get the WSUS groups from a server and I integrate the data in a variable. I would like to delete a specific line in this variable.

For example with a part of the imaginary script :

Write-Output "Delete start"
$Var = ("one", "two", "three", "four")
$Var
$Var_end = $Var.Remove("two")

Write-Output "Delete end"
$Var_end

I want to remove the two value so that the rest of the script can retrieve what's in my variable without retrieving the two or passing on an empty line (as I've already managed to do)

I have tried several functions, in different directions but there is nothing to do I also tried with the function

$Var_end = $Var | select -skip 1

But it's not what I'm looking for because it doesn't look clean as a function, if ever the value changes, I'll have to adapt the script afterwards.

2
  • 2
    $var_end = @($var) -ne 'two' <- when applied to an array/collection, the comparison operators (like -ne) acts as filters Commented Jun 27, 2022 at 14:26
  • Thank you very much, I've been looking for several days and I couldn't find anything. Commented Jun 27, 2022 at 14:32

2 Answers 2

3

The idiomatic solution to removing items in an array is to use PowerShell's pipeline and the Where-Object cmdlet to filter the original collection and create a new one by assigning the results to a variable:

$list = 'one','two','three','four'
$filteredList = $list |Where-Object { $_ -ne 'two' }

But in this case where we're looking to exclude an exact value, you can also use the comparison operators in filter mode:

$filteredList = @($list) -ne 'two'

PowerShell will recognize that the left-hand side of the -ne operation is an enumerable collection, and will apply -ne as a filter, giving you the exact same result as if you'd used Where-Object.

Beware that neither option guarantees an array as the result - for that, you'd need to wrap the entire statement in @(...), or strongly type the receiving variable:

$filteredList = @( ... )
# or
[array]$filteredList = ...
Sign up to request clarification or add additional context in comments.

Comments

0

You already got a helpful answer that shows the normal way to solve the problem in PowerShell.

As for what you have tried:

$Var = ("one", "two", "three", "four")
$Var_end = $Var.Remove("two")

Although an Array has a method Remove(), it is non-functional, because arrays are of fixed size. So to change the size of an Array you'd have to create a new one of the desired size and copy elements from the old array into the new array. That the Remove() method even exists can be explained because the Array class implements the IList interface.

The .NET framework does provide dynamically resizable data structures that behave similar to arrays in most regards. One of these is the List class:

$var = [Collections.Generic.List[object]] ("one", "two", "three", "four")
$null = $var.Remove("two") 

The Remove() method modifies the $var object in-place. Assigning to $null avoids implicitly outputting the result of the method, which we are not interested in (it's a boolean indicating whether the item was found).

While that method works, most of the time it isn't needed and just complicates the code, because it works against PowerShell idioms. Using the filtering capabilities of PowerShell, as explained by Mathias's answer, allows us to write much cleaner code.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.