2016-11-29 2 views
2

원격 서버에 대해 GCI를 실행하려는 간단한 문제가 있습니다. 문제는 다른 해시 테이블 속성과 결합되어 GCI가 실패합니다.해시 테이블의 속성을 확장

$ShortDate = (Get-Date).ToString('MM/dd/yyyy') 
$CheckServer = @{} 
$serverObjects = @() # create a list of server objects 

Import-Csv $Dir\Servers.csv | ForEach { 
    $CheckServer.Server = $_.Server 
    $CheckServer.Platform = $_.Platform 

    if (GCI \\$_.Server\c$\log\Completed_Summary_*.html -EA 0 | where {$.LastWriteTime -ge "$ShortDate"}) { 
     Write-Host "FOUND" 
    } # end of IF GCI 
} # end of For-Each 

$serverObjects += New-Object -TypeName PSObject -Property $CheckServer 

문제는 항목이다 :

스크립트는

여기

내가있어 무엇을, 헤더는 "서버"와 "플랫폼"있는 두 개의 열이 .CSV에서 항목을 읽 $_.Server은 SERVER1, SERVER2, SERVER3 등이어야하며 servers.csv의 모든 항목은 $_.Server$_.Platform의 값이 결합되어야합니다. 예를 들면 :

Write-Host "Checking" \\@{Server=SERVER1; Platform=PLATFORM_1}.Server\c$\log\Completed_Summary_*.html 

다음과 같이 보여해야합니다

Write-Host "Checking" \\SERVER1\log\Completed_Summary_*.html 

을 GCI 명령이 작동이되도록 어떻게 그들을 해제 결합합니까?

+0

시도 : 'foreach는 (. $에서 $ 서버 _ 서버) {경우 (GCI \\ $ Server \ c $ \ log \ Completed_Summary _ * .html -EA 0 | where {$ .LastWriteTime -ge "ShortDate"}) {Write-Host "Foound"}}' – iRon

답변

5

PowerShell은 문자열 내에서 간단한 변수 확장 만 수행합니다. 인덱스 연산이나 객체 프로퍼티/메소드에 접근하는 것과 같은 더 복잡한 표현식의 경우 배열 또는 객체 변수의 문자열 화 된 값을 삽입하고 나머지 연산은 그대로 둡니다.

는 데모 :

  • 변수 처음에 결과 값을 할당하고 문자열에서 그 변수를 사용합니다 :

    $value = $array[5] 
    Write-Host "some $value or other" 
    
    $value = $object.Foo 
    Write-Host "some $value or other" 
    
  • PS C:\>$array = 23, 42 
    PS C:\>Write-Host "some $array[1] or other" 
    some 23 42[1] or other 
    PS C:\>$object = New-Object -Type PSObject -Property @{Foo=23; Bar=42} 
    PS C:\>Write-Host "some $object.Foo or other" 
    some @{Bar=42; Foo=23}.Foo or other

    이러한 문제가 발생하지 않도록하려면 당신도 할 필요가

  • subexpression ($(...)) :

    Write-Host "some $($array[5]) or other" 
    Write-Host "some $($object.Foo) or other" 
    
  • 사용 format operator (-f) :

    Write-Host "some {0} or other" -f $array[5] 
    Write-Host "some {0} or other" -f $object.Foo 
    
+0

이제 Ansgar를 사용해보십시오. – Kenny

+0

기존 스크립트로 위와 같은 작업을 수행하려면 어떻게해야합니까? "$ ($ CheckServer [1])"을 (를) 검사하고 "$ ($ ServerObjects [1])를 (를) 검사하는"쓰기 호스트를 시도했으며 결과도 산출하지 않았습니다. – Kenny

+0

'$ CheckServer'는 배열이 아닌 해시 테이블이고,'$ ServerObjects'는 빈 배열입니다. 왜냐하면 코드가 결코 그것을 채우지 않기 때문입니다. 그래서 두 가지 시도가 모두 효과가없는 것입니다. 귀하의 질문에있는 코드를 사용하면'\\ $ _. Server \ c $ \ log \ Completed_Summary _ * .html'을 \\ $ ($ _. Server) \ c $ \ log \ Completed_Summary_로 변경하면됩니다. * .html ". 그러나 귀하의 질문에 귀하가 게시 한 내용이 귀하의 실제 코드가 아니거나 귀하의 완전한 코드가 아닌 것으로 판단하십시오. –

0

수정 같은 그

$ShortDate = Get-Date -Hour 0 -Minute 0 -Second 0 
$CheckServer = @{} 
$serverObjects = @() # create a list of server objects 
$Dir="C:\temp" 

Import-Csv $Dir\Servers.csv | ForEach { 
    $CheckServer.Server = $_.Server 
    $CheckServer.Platform = $_.Platform 

    if (GCI "\\$($_.Server)\c$\log\Completed_Summary_*.html" -EA 0 | where {$_.LastWriteTime -ge $ShortDate}) 
    { 
     Write-Host "FOUND" 
    } 
} 
+0

Thx, 나는 이것을 시도했지만, 나는 작동하지 않았다. 나는 "$ .LastWriteTime '이라는 용어를 반복해서 사용한다. – Kenny

+0

하지만 내 코드에서 $ _. LastWriteTime '을 수정했으며이 코드는 내 PC에서 작동합니다 – Esperento57

관련 문제