2014-03-26 2 views
0

나는 Powershell이 ​​아닌 대부분의 언어를 직감적으로 파악할 수 있습니다.Powershell - + = 연산자를 사용하기 위해 배열을 선언하는 방법

배열 배열을 만들려고합니다 (디스크 디렉토리와 개수가 포함되므로 나중에 많은 파일이 있는지 확인할 수 있습니다).

배열의 배열에서 Get-ChildItem에 전달할 수 있도록 디렉터리 이름의 배열 하나만 가져 오려고합니다.

$DirInfo = @('d:\Work',2), 
      ('d:\Temp',3) 

[email protected]()      #declare empty array 
foreach ($item in $DirInfo) 
    { 
    $DirNameArray += , $item[0]  #tried with and without the comma here 
    Write-Host 'Loop1 ' $item[0] 
    } 

write-host $DirNameArray.count 

#Let's Verify what we got so we know how many items we have in our array 
Write-Host "Verify with a loop" 
foreach ($dir in $DirNameArray) 
    { 
    Write-Host 'Loop2:' $dir 
    } 

Write-Host "Verify the other way" 
Write-Host $DirNameArray 

실제 결과 : LOOP2 두 번 실행하지 않았는지 이해가 안 무엇

Loop1 d:\Work 
Loop1 d:\Temp 
1 
Verify with a loop 
Loop2: d:\Workd:\Temp 
Verify the other way 
d:\Workd:\Temp 

입니다. = + + $ DirNameArray라는 배열에 새 항목을 추가하는 대신 값을 함께 연결하는 것 같습니다.

나는 아직도 완전히 당황하고있어

, 내가 만든 하나 개의 파일이 작업을 수행하고 나에게 예상되는 결과를 제공합니다

$a = "one","two" 
Write-Host $a.count 

$a += "three" 
Write-Host $a.count 

결과 :

2 
3 

위에서 근무 그래서 경우를하지 않은 이유 내 코드가 작동합니까?

내가 만든 두 번째 파일은이 작업을 수행하며 결과를 이해하지 못합니다.

$DirNameArray5="abc","def" 
write-host $DirNameArray5.count 

$DirNameArray5 += "xyz" 
write-host $DirNameArray5.count 
$DirNameArray5 += @("opq") 
write-host $DirNameArray5.count 

결과 :

1 
1 
1 

$DirNameArray7="abc","def" 
write-host $DirNameArray7.count 

$DirNameArray7 += "xyz" 
write-host $DirNameArray7.count 
$DirNameArray7 += @("opq") 
write-host $DirNameArray7.count 

결과 : 심지어 다른 변수 이름은 그래서 그 변수의 사전 정의 또는 값을 처리되지 않을 만든

2 
3 
4 

그래서 변수를 문자열로 정의한 경우 Powershell에 배열로 다시 정의하는 것이 어렵습니다.

하지만 여전히 원래 질문이 있습니다. 빈 배열을 정의하여 + = 연산자를 사용하여 루프에 추가 할 수있는 방법. PS C :

[email protected]() 

나는 결국 내 변수가 실제로 무엇인지 확인하기 위해 .GetType() 메소드를 사용하는 사용자 \ nwalters> $ DirNameArray5.GetType()

IsPublic IsSerial Name          BaseType                     
-------- -------- ----          --------                     
True  True  String         System.Object                    



PS C:\Users\nwalters> $DirNameArray7.GetType() 

IsPublic IsSerial Name          BaseType                     
-------- -------- ----          --------                     
True  True  Object[]         System.Array  

결론을 \ -이 내가하고 싶은 것입니다 - 가능한 코드로 몇 줄 더 루프 :

[string][email protected]() # declare empty array 
Write-Host $x.GetType() 
$x += "one" 
$x += "two" 
Write-Host $x.count 
Write-Host $x 

실제 결과

,
System.String 
1 
onetwo 

원하는 결과

object[] or string[]??? 
2 
one two 
+0

에게 제공합니다. 루프 사이에'write-host $ DirNameArray.count' 줄을 추가해보십시오. $ DirNameArray가 배열 인 경우 Count 속성은 요소 수를 표시합니다. – andyb

+0

PowerShell의 '플랫 팅 (flattening)'배열과 관련이 있는지 모르겠지만 (그렇다고 추측 할 수 있습니다) 그렇다면 go-to 리소스가 Keith Hill의 블로그 기사 http://rkeithhill.wordpress.com/ 인 것 같습니다. 2007/09/24/effective-powershell-item-8-output-cardinality-scalars-collections-and-empty-sets-oh-my/ – andyb

+0

그리고 count는 1을 보여 주며, 배열에 추가하지만 문자열 끝에 문자열 데이터를 추가하기 만하면됩니다. 나는 블로그를 읽었다. 내가 여기에서 도와 줄 수있는 것이 없다는 것을 확신하지 못한다. – NealWalters

답변

1

다음 코드는 PowerShell을 2.0 두, 두 개의 서로 다른 컴퓨터에서 테스트됩니다. 이것을 시도하고 결과를 게시 할 수 있습니까?

 
# declare an empty array 
$var = @() 
write-host "var.count = '$($var.count)' var.type ='$($var.GetType())' var.type.BaseType = '$($var.GetType().BaseType)'" 

# add a single item 
$var += "single item" 
write-host "var.count = '$($var.count)' var.type ='$($var.GetType())' var.type.BaseType = '$($var.GetType().BaseType)'" 

# add an array 
$var += , @("array 1 - item 1","array 1 - item 2") 
write-host "var.count = '$($var.count)' var.type ='$($var.GetType())' var.type.BaseType = '$($var.GetType().BaseType)'" 

# display the 'single item' 
write-host "single item = '$($var[0])'" 

# display first element of array item 
write-host "first element of array item = '$($var[1][0])'"

이 코드는 (PowerShell을 2에서) 나를 위해 일한 나를

 
var.count = '0' var.type ='System.Object[]' var.type.BaseType = 'array' 
var.count = '1' var.type ='System.Object[]' var.type.BaseType = 'array' 
var.count = '2' var.type ='System.Object[]' var.type.BaseType = 'array' 
single item = 'single item' 
first element of array item = 'array 1 - item 1'
+0

감사. 나는 두 가지에 대해 혼란 스럽다 : 1) [string] $ x = @()와 $ x = @()의 차이점 2) My DirNameArray 프로그램이 오늘 정상적으로 실행되었지만 어제 실패했다. 나는 이유를 모른다. 나는 여전히 메모리에서 낡은 변수를 가지고 있어야만 제대로 삭제되지 않을 것이라고 생각한다. – NealWalters

+0

'remove-varable VarName'과 같이 변수를 재설정 할 수 있습니다. 'Remove-Variable DirNameArray'. var가 사라 졌음을 증명하려면'get-variable (varname)'을 사용하십시오. – andyb

+0

게시 한 코드를 사용해 보셨습니까? 그렇다면, 나 같은 결과를 얻었습니까? – andyb

관련 문제