PowerShell 배열에서 항목 [0] 제거
배열의 첫 줄(항목 ID)을 제거하는 데 어려움을 겪고 있습니다.
$test.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
시도한 모든 옵션을 나열하려면,$test | gm그리고 분명히 다음과 같이 명시하고 있습니다.
Remove Method void IList.Remove(System.Object value)
RemoveAt Method void IList.RemoveAt(int index)
그래서 내가 노력할 때.$test.RemoveAt(0)오류가 발생합니다.
Exception calling "RemoveAt" with "1" argument(s): "Collection was of a fixed size."At line:1 char:1
+ $test.RemoveAt(1)
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : NotSupportedException
제 어레이가 다음과 같은 유형이어야 한다는 것을 알게 되었습니다.System.Object사용할 수 있는$test.RemoveAt(0). 스크립트의 시작 부분에 있는 모든 어레이를 목록으로 선언하는 것이 최선의 방법입니까?아니면 다음과 같이 어레이를 변환하는 것이 더 나을까요?$collection = ({$test}.Invoke())나중에 이 기능이 필요할 때 목록에 추가할 수 있습니까?
두 가지 유형의 장단점은 무엇입니까?도와주셔서 고맙습니다.
다른 옵션은 파워셸의 기능을 사용하여 여러 변수를 할당하는 것입니다(다른 답변 참조).
$arr = 1..5
$first, $rest= $arr
$rest
2
3
4
5
10년 넘게 파워셸의 특징이었습니다.MSDN 블로그 게시물에서 이 기능을 발견했습니다.
배열은 오류가 말하는 것처럼 고정된 크기입니다.RemoveAt()는 일반 배열에는 적용되지 않는 상속 메서드입니다.배열의 첫 번째 항목을 제거하려면 다음과 같이 첫 번째 항목을 제외한 모든 항목을 포함하는 복사본으로 배열을 덮어쓸 수 있습니다.
$arr = 1..5
$arr
1
2
3
4
5
$arr = $arr[1..($arr.Length-1)]
$arr
2
3
4
5
서로 다른 인덱스의 값을 제거해야 하는 경우 다음을 사용하는 것을 고려해야 합니다.List. 지원합니다.Add(),Remove()그리고.RemoveAt():
#If you only have a specific type of objects, like int, string etc. then you should edit `[System.Object] to [System.String], [int] etc.
$list = [System.Collections.Generic.List[System.Object]](1..5)
$list
1
2
3
4
5
$list.RemoveAt(0)
$list
2
3
4
5
이전 SO 답변 보기 및 정보_어레이는 어레이의 작동 방식에 대한 자세한 정보를 제공합니다.
를 사용하여 첫 번째 카운트 항목을 생략할 수 있습니다.
PS C:\> 1..3 | Select-Object -Skip 1
2
3
PS C:\>
PS C:\> 1 | Select-Object -Skip 1
PS C:\>
이를 통해 더 정교한 방법을 사용하지 않고 배열에서 임의 요소가 발생할 때마다 제거할 수 있습니다.NET 개체.
$x=<array element to remove>
$test = $test | Where-Object { $_ -ne $x }
아니면.
$x=<array index to remove>
$test = $test | Where-Object { $_ -ne $test[$x] }
이렇게 하면 동일한 작업이 수행되지만 요소 중 하나만 제거됩니다.중복이 있으면 남아있을 것입니다.위와 같이 인덱스 스타일을 통해 수행할 수도 있습니다.
$x=<array element to remove>
$skip=$true
$test = $test | ForEach-Object { if (($_ -eq $x) -and $skip) { $skip=$false } else { $_ } }
그리고 댓글 중 하나를 근거로 해서 만약 여러분들이 그것을 확신할 수 있는.$test는 배열입니다. 그들이 생각하는 것보다$test=@($test)첫번째.
업데이트를 위해 - @Frode F. 답변에 문제가 있습니다.
배열에 있는 요소의 수가 1개 이상인 경우
$arr = $arr[1..($arr.Length-1)]
만약 요소의 개수가 1개라면, 이것은 요소를 제거하지 못합니다.
if($arr.Length -le 1) {
$arr = @()
}
else {
$arr = $arr[1..($arr.length - 1)]
}
상황에 따라 달라질 것 같습니다.첫 번째 요소를 한 번만 제거하면 되는 경우 배열 슬라이싱을 사용할 수 있습니다.
$arr = $arr[1..($arr.length-1)]
반복적으로 수행하려면 배열 목록이나 일반 컬렉션부터 시작해야 합니다.대용량 배열인 경우 파이프라인에서 배열을 생성한 후 컬렉션으로 변환하는 대신 스크립트 블록에 생성하는 식을 넣고 .invoke()를 수행하는 것이 좋습니다.
remove at ()는 배열 목록과 함께 작동합니다(예: $error).
[collections.arraylist]$a = get-process
$a.removeat(0)
답변이 늦어서 죄송합니다만, 저도 이것 때문에 어려움을 겪고 있었습니다.제 목적과 목적(텍스트 파일에 쓰기)을 위해 배열이 고정된 크기이기 때문에 제거하는 대신 string.empty로 값을 설정할 수 있다는 것을 깨달았습니다.
$results = SQLQuery -connectionString $connectionString -query $query;
$results[0] = '';
foreach ($r in $results) {
Add-Content $skus $r[0];
}
이것은 제 플랫 파일에서 원하지 않았던 헤더를 없앴습니다.이것이 다른 사람에게 도움이 되길 바랍니다.
빅 어레이(또는 ArrayList)를 일부 부품에서 수행해야 하는 경우가 있다면 라이프핵을 사용했습니다.
#$bigArray with thousands of items
while($bigArray.Count -gt 0)
{
if($bigArray.Count -gt 100)
{
$k = 100
}else {$k = $bigArray.Count}
$part = $bigArray | select -First $k
#now we can make some operations with this $part
#in the end of loop we should exclude this part from big array
if($bigArray.Count -gt 100)
{
$bigArray = $bigArray | select -Last ($bigArray.Count - $k)
}else {$bigArray = @()}#in this step we have been handle last part of array and we should null him for stop loop
}
이제는 대용량 어레이를 일부(100개 항목) 처리할 수 있습니다.
다른 답변과 나의 사소한 변경 사항의 조합(나의 $profile에서 글로벌 기능으로 사용):
function global:sudo {
$runArgs = $args
if($runArgs.Length -le 1) {
$runArgs = ""
}
else {
$runArgs = $runArgs[1..($runArgs.length - 1)]
$runArgs = $runArgs -join " "
}
Start-Process $args[0] -ArgumentList $runArgs -Verb runas
}
그래서 둘다sudo notepad그리고.sudo notepad c:\windows\abc.txt효과가 있을 것이고, 논쟁은 우아하게 통과되어야 합니다. (하지만 실제로 철저히 확인하지는 않았습니다.)
알려진 인덱스 x(기준 0)만큼 행을 삭제하려면 배열의 아래쪽과 위쪽 부분만 복사할 수도 있습니다.
arry에서 행 x 삭제
$LastElement = $arry.GetUpperBound(0)
if ($LastElement -ge 0) {
if ($x -eq 0) {
$lowerRange = @()
} else {
$lowerRange = @($arry[0..($x-1)])
}
if ($x -eq $LastElement) {
$upperRange = @()
} else {
$upperRange = @($arry[($x+1)..$LastElement])
}
$arry = @($lowerRange; $upperRange)
}
이것을 하기 위해서는 더 간단하고 우아한 방법이 있습니다.이 답변은 (이전에 제시된 다른 답변과 달리) 단일 요소를 가진 어레이에서도 작동합니다.원하는 인덱스에서도 작동합니다.
$arr = @(1,2,3)
$arr -ne $arr[0] #remove first element: @(2,3)
$arr -ne $arr[1] #remove second element: @(1,3)
$arr -ne $arr[-1] #remove last element: @(1,2)
언급URL : https://stackoverflow.com/questions/24754822/powershell-remove-item-0-from-an-array
'source' 카테고리의 다른 글
| Android에서 다른 보기 위에 보기 배치/오버랩(z-index) (0) | 2023.10.06 |
|---|---|
| DDD 및 MVC: '모델'과 '엔티'의 차이 (0) | 2023.10.06 |
| 'ERROR 2002 (HY000):소켓 '/var/run/mysqld/mysqld를 통해 로컬 MySQL 서버에 연결할 수 없습니다.sock' (2 "해당 파일 또는 디렉토리 없음")' (0) | 2023.10.06 |
| git: "branch 이름"과 "refs/heads/branch 이름"의 차이 (0) | 2023.10.06 |
| SQL Server 2008 R2가 단일 사용자 모드로 고착됨 (0) | 2023.10.06 |