在powershell中将变量从一个函数传递到另一个函数

edqdpe6u  于 2022-12-23  发布在  Shell
关注(0)|答案(1)|浏览(181)

我有一个函数,它接收到一个参数,这个参数包含了它应该处理的文件($archivo)。这个相同的值应该被传递给另一个函数,这个函数在同一个函数中被调用。但是由于某种原因,我在第二个函数中得到了一个空值。

function EXTRAER_DATA_COMIDA_Y_CREAR_WORD ($archivo) {
    
    write-host "EXTRAER_DATA_COMIDA" -foreground green
    $FILE = Join-Path -Path $root\UNB\FACTURA_FINAL\ -ChildPath $archivo
    $result = switch -Regex -File $FILE {
        '^([\d,.]+)\s+([\w\s]+)\s+([\d,.]+)' { 
            [PsCustomObject]@{
                Quantity = $matches[1].Trim()
                Product  = $matches[2].Trim()
                Price    = $matches[3].Trim()
            }
        }
    }
    
     ,$result
     CREAR_DOCWORD($result,$archivo)
    
}

做这件事的正确方法是什么?
先谢了!
编辑:这是我能找到的新代码

$results =function EXTRAER_DATA_COMIDA_Y_CREAR_WORD($archivo) 
{

write-host "EXTRAER_DATA_COMIDA" -fore green
$FILE = Join-Path -Path $root\UNB\FACTURA_FINAL\ -ChildPath $archivo
$result = switch -Regex -File $FILE {
    '^([\d,.]+)\s+([\w\s]+)\s+([\d,.]+)' { 
        [PsCustomObject]@{
            Quantity = $matches[1].Trim()
            Product  = $matches[2].Trim()
            Price    = $matches[3].Trim()
        }
    }
}
 ,@($result)
 Write-Host "variables que entran a docword" $results $results.GetType() $archivo
 CREAR_DOCWORD $results $archivo

}

FUNCTION CREAR_DOCWORD($COMIDA,$archivo) {

$objWord = New-Object -ComObject word.application
$objWord.Visible = $True
$Path = "$root\UNB\script\Tiquete_UnBilling.docx"
$objDoc = $objWord.Documents.Open("$Path")
$objSelection = $objWord.Selection

Write-Host "variables docword" $COMIDA $COMIDA.GetType() $archivo
   
    ## ESTA FUNCION CREA LA TABLA CON LOS DATOS DE COMIDA

    Write-Host "TAMAÑO ARRAY" $COMIDA.Length
    Write-Host "NOMBRE ARCHIVO" $archivo

    $table = $objDoc.Tables(1)
    
    for ($i=0; $i -le $comida.Count; $i++){
    Write-Host "contador" $i
    $table.rows.add() | out-null
    $table.cell(($i+2),1).Range.Text = $comida[$i].Quantity
    $table.cell(($i+2),2).Range.Text = $comida[$i].Product
    $table.cell(($i+2),3).Range.Text = $comida[$i].Price
    }
}

即使使用@($result),我也会得到一个看起来像System.Management.Automation.PSCustomObject的类型对象,所以它不能在for循环中使用,因为它没有大小。

5vf7fwbs

5vf7fwbs1#

让它工作...代码如下。

function EXTRAER_DATA_COMIDA_Y_CREAR_WORD($archivo) 
{

write-host "EXTRAER_DATA_COMIDA" -fore green
$FILE = Join-Path -Path $root\UNB\FACTURA_FINAL\ -ChildPath $archivo
$result = switch -Regex -File $FILE {
    '^([\d,.]+)\s+([\w\s]+)\s+([\d,.]+)' { 
        [PsCustomObject]@{
            Quantity = $matches[1].Trim()
            Product  = $matches[2].Trim()
            Price    = $matches[3].Trim()
        }
    }
}
 Write-Host "variables que entran a docword" $result $result.GetType() $archivo
 &CREAR_DOCWORD -COMIDA @($result) -archivo $archivo

}

FUNCTION CREAR_DOCWORD {

Param($COMIDA,$archivo)

$objWord = New-Object -ComObject word.application
$objWord.Visible = $True
$Path = "$root\UNB\script\Tiquete_UnBilling.docx"
$objDoc = $objWord.Documents.Open("$Path")
$objSelection = $objWord.Selection

Write-Host "variables docword" $COMIDA $COMIDA.GetType() $archivo
   
    ## ESTA FUNCION CREA LA TABLA CON LOS DATOS DE COMIDA

    Write-Host "TAMAÑO ARRAY" $COMIDA.Length
    Write-Host "NOMBRE ARCHIVO" $archivo

    $table = $objDoc.Tables(1)
    
    for ($i=0; $i -le $comida.Count; $i++){
    Write-Host "contador" $i
    $table.rows.add() | out-null
    $table.cell(($i+2),1).Range.Text = $comida[$i].Quantity
    $table.cell(($i+2),2).Range.Text = $comida[$i].Product
    $table.cell(($i+2),3).Range.Text = $comida[$i].Price
    }

    ## ESTA FUNCION SUSTITUYE TEXTO

    Write-Host "ESTA FUNCION SUSTITUYE TEXTO" -fore White
    
    $consecutivo_fact =get-random -maximum 100
    $fecha= Get-Date -Format "dd/MM/yyyy"
    $hora= Get-Date -Format "HH:mm tt"
    $CODIGO_UNBILLING=  -join ((0x30..0x39) + ( 0x41..0x5A) + ( 0x61..0x7A) | Get-Random -Count 8  | % {[char]$_}) 

    Write-Host "ARCHIVO " $archivo -fore White

    $content = Get-Content $root\UNB\FACTURA_FINAL\$archivo

     for($i = 0; $i -lt $content.Count; $i++)
    {
 
     $line = $content[$i]
     Write-Host $line

     if ($line.Contains('%SER'))
       
       {
       $SERVICIO=$line.Split(' ')[-1]
       }

    elseif ($line.Contains('SubTotal'))
    
        {
        $SUBTOTAL=$line.Split(' ')[-1]
        }

    elseif ($line.Contains('Descto'))
    
        {
        $DCTO=$line.Split(' ')[-1]
        }

    elseif ($line.Contains('TOTALES :'))
    
        {
        $TOTALFACTURA=$line.Split(' ')[-1]
        }

    elseif ($line.Contains('%IVA'))
    
        {
        $IVA=$line.Split(' ')[-1]
        }

    elseif ($line.Contains('Mesa #'))
    
        {
        $MESA=$line.Split(' ')[4]
        }

     else {
     $DCTO="0.00"
     }

    }

    $hash = @{"[CONS]" = "$consecutivo_fact"; "[FECHA]"="$fecha"; "[HORA]"="$hora"; "[CODIGO]"="$CODIGO_UNBILLING".ToUpper();"[CarSer]"="$SERVICIO";"[TV]"="$SUBTOTAL";"[TD]"="$DCTO";
    "[TVN]"="$TOTALFACTURA";"[IVA]"="$IVA";"[TOTAL]"="$TOTALFACTURA";"[MESA]"="$MESA"}

    $objSelection = $objWord.Selection
   
    $MatchCase = $false
    $MatchWholeWord = $true
    $MatchWildcards = $false
    $MatchSoundsLike = $false
    $MatchAllWordForms = $false
    $Forward = $true
    $wrap = $wdFindContinue
    $wdFindContinue = 1
    $Format = $false
    
    $ReplaceAll = 2

    foreach($value in $hash.Keys) {
    
    $ReplaceWith = $hash[$value]
    $FindText = $value
    $objSelection.Find.Execute($FindText, $MatchCase, $MatchWholeWord, $MatchWildcards, $MatchSoundsLike, $MatchAllWordForms, $Forward, $wrap, $Format, $ReplaceWith, $ReplaceAll)
   
    }

    }

相关问题