2013-05-17 3 views
2

PowerShell 사용 사용자 입력을 캡처하고 입력을 Excel 스프레드 시트의 데이터와 비교하여 해당 셀의 데이터를 변수에 쓰고 싶습니다. 나는 PowerShell을 처음 접했고 그 사실을 알 수 없었다. 예를 들면 다음과 같습니다. 사용자가 저장 번호를 입력하라는 메시지가 나타나면 "123"을 입력합니다. 그러면 입력이 A 열의 데이터와 비교됩니다. 해당 셀의 데이터가 캡처되어 변수 $ GoLiveDate에 기록됩니다.Powershell로 Excel 데이터 읽기 및 변수에 쓰기

도움을 주시면 감사하겠습니다.

샘플 데이터 : http://reddirttechnology.com/table.html

답변

11

사용자 입력은 다음과 같이 읽을 수 있습니다 :

$num = Read-Host "Store number" 

Excel에서 다음과 같이 처리 할 수 ​​있습니다 : 하나 개의 컬럼에

$xl = New-Object -COM "Excel.Application" 
$xl.Visible = $true 
$wb = $xl.Workbooks.Open("C:\path\to\your.xlsx") 
$ws = $wb.Sheets.Item(1) 

이 찾고 값 및 할당 다른 열에서 변수로의 해당 값은 다음과 같이 수행 될 수 있습니다.

작업을 완료 한 후
for ($i = 1; $i -le 3; $i++) { 
    if ($ws.Cells.Item($i, 1).Value -eq $num) { 
    $GoLiveDate = $ws.Cells.Item($i, 2).Value 
    break 
    } 
} 

clean up하는 것을 잊지 마세요 :

$wb.Close() 
$xl.Quit() 
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl) 
+1

"System.Management.Automation.PSParameterizedProperty"유형의 PSMemberInfo 객체에 대해 Value 속성을 설정할 수 없습니다. 줄 번호 : 7 char : 30 + if ($ ws.Cells.Item ($ i, 1). <<<< Value = $ num) { + CategoryInfo : InvalidOperation :(:) [], RuntimeException + FullyQualifiedErrorId : PropertyAssignmentException 그게 내가 얻는 것입니다. – squishy79

+0

내 실수. PowerShell의 비교 연산자는'='이 아니라'-eq'입니다. 결정된. –

+1

이것은 작동합니다! 나는 독서 파일이 악명 높게 느린 것을 발견했다. 몇 가지 조사를 한 후에는 Import-CSV cmdlet을 사용하여 CSV를 읽는 것이 더 빠릅니다. 참조 된 cmdlet을 사용하여 CSV 파일을 호출하는 방법을 알고 있습니다. 사용자 입력을 받아서 CSV 파일에서 해당 데이터를 가져 오려면 어떻게해야합니까? – squishy79

2

나는 것이 바람직 엑셀과 상호 작용하는 인 OleDB 연결을 사용하도록 찾을 수 있습니다. COM interop보다 빠르며 import-csv보다 오류가 적습니다. 하나의 psobject가 하나의 행이고 각 속성이 열에 해당하는 psobjects 컬렉션을 준비하여 원하는 대상 눈금과 일치시키고 Excel 파일에 삽입 할 수 있습니다. 마찬가지로 PSObject 컬렉션 대신 DataTable을 삽입 할 수도 있지만 일부 데이터 소스에서 데이터를 검색하여 시작하지 않는 한 PSObject 컬렉션 방식이 일반적으로 더 쉽습니다.

여기에 내가 엑셀에 psobject 수집을 쓰기 위해 사용하는 기능입니다 :

function insert-OLEDBData ($file,$sheet,$ocol) { 

    { 
     "xlsb$" 
      {"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$File`";Extended Properties=`"Excel 12.0;HDR=YES;IMEX=1`";"} 
     "xlsx$" 
      {"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$File`";Extended Properties=`"Excel 12.0 Xml;HDR=YES;IMEX=1`";"} 
    } 
    $OLEDBCon = New-Object System.Data.OleDb.OleDbConnection($cs) 

    $hdr = $oCol|gm -MemberType NoteProperty|%{$_.name} 

    $names = '[' + ($hdr-join"],[") + ']' 
    $vals = (@("?")*([array]$hdr).length)-join',' 

    $sql = "insert into [$sheet`$] ($names) values ($vals)" 

    $sqlCmd = New-Object system.Data.OleDb.OleDbCommand($sql) 
    $sqlCmd.connection = $oledbcon 

    $cpary = @($null)*([array]$hdr).length 

    $i=0 
    [array]$hdr|%{([array]$cpary)[$i] = $sqlCmd.parameters.add($_,"VarChar",255);$i++} 
    $oledbcon.open() 

    for ($i=0;$i-lt([array]$ocol).length;$i++) 
    { 
     for ($k=0;$k-lt([array]$hdr).length;$k++) 
     { 
      ([array]$cpary)[$k].value = ([array]$oCol)[$i].(([array]$hdr)[$k]) 
     } 
     $res = $sqlCmd.ExecuteNonQuery() 
    } 
    $OLEDBCon.close() 

} 
0

내가 이걸 발견하고, 예브게니의 대답. 위의 함수가 작동하려면 약간의 변경을해야했습니다. 가장 중요한 것은 입력 배열에서 NULL 또는 빈 값의 값을 처리하는 것입니다. 다음은 약간의 변경 사항이있는 Yevgeniy 코드입니다.

function insert-OLEDBData { 
    PARAM (
     [Parameter(Mandatory=$True,Position=1)] 
     [string]$file, 
     [Parameter(Mandatory=$True,Position=2)] 
     [string]$sheet, 
     [Parameter(Mandatory=$True,Position=3)] 
     [array]$ocol 
    ) 
    $cs = Switch -regex ($file) 
    { 
     "xlsb$" 
      {"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$File`";Extended Properties=`"Excel 12.0;HDR=YES`";"} 
     "xlsx$" 
      {"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$File`";Extended Properties=`"Excel 12.0 Xml;HDR=YES`";"} 
    } 
    $OLEDBCon = New-Object System.Data.OleDb.OleDbConnection($cs) 

    $hdr = $oCol | Get-Member -MemberType NoteProperty,Property | ForEach-Object {$_.name} 

    $names = '[' + ($hdr -join "],[") + ']' 
    $vals = (@("?")*([array]$hdr).length) -join ',' 

    $sql = "insert into [$sheet`$] ($names) values ($vals)" 

    $sqlCmd = New-Object system.Data.OleDb.OleDbCommand($sql) 
    $sqlCmd.connection = $oledbcon 

    $cpary = @($null)*([array]$hdr).length 

    $i=0 
    [array]$hdr|%{([array]$cpary)[$i] = $sqlCmd.parameters.add($_,"VarChar",255);$i++} 
    $oledbcon.open() 

    for ($i=0;$i -lt ([array]$ocol).length;$i++) 
    { 
     for ($k=0;$k -lt ([array]$hdr).length;$k++) 
     { 
      IF (([array]$oCol)[$i].(([array]$hdr)[$k]) -notlike "") { 
       ([array]$cpary)[$k].value = ([array]$oCol)[$i].(([array]$hdr)[$k]) 
      } ELSE { 
       ([array]$cpary)[$k].value = "" 
      } 
     } 
     $res = $sqlCmd.ExecuteNonQuery() 
    } 
    $OLEDBCon.close() 
} 
관련 문제