Weblog @ rebex.cz

Weblogy na webu Rebexu
Welcome to Weblog @ rebex.cz Sign in | Help
in Search

VasekB

  • Vrácení hodnot z funkce v PowerShellu zpět do DOS-CMD scriptu

    Pěkně mne podusilo vrácení hodnot z funkce v PowerShellu zpět do DOS-CMD scriptu.
    Když se použije pro návrat hodnoty z funkce "return $hodnota", tak je výstup automaticky oříznut podle velikosti DOS-CMD okna, ve kterém to bylo spuštěno, což při předávání hodnot ve scriptu dál je docela problém ;o) Vzpomněl jsem si na problémy s vracením hodnot, které popisoval Martin Žugec
    http://martinzugec.blogspot.com/2008/08/returning-values-from-fuctions-in.html

    ale postrčilo mne až
    http://weblogs.asp.net/soever/archive/2008/12/09/powershell-output-capturing-and-text-wrapping-strange-quirks-solved.aspx

    a správně je tedy vracet pomocí "$hodnota | write-host" ("write-host $hodnota" nefunguje)

     
    Spuštění LogStatus.cmd v DOS-CMD okně  o velikosti Screen Buffer Size 80x50 uloží funkce Get-LogStatusKO do LogStatus.csv data zalomené na dva řádky. Pokud se totéž spustí v třeba 200x50, tak bude vše správně na jednom řádku.
     
    ----- LogStatus.cmd -----
    setlocalset logIn=.\LogStatus.txt
    set logOut=.\LogStatus.csv
    for /f "tokens=1,2 delims=;" %%i in ('powershell.exe -NoLogo -NoProfile -NonInteractive -Command "& '.\LogStatus.ps1'" """%log%"""') do (
      if NOT exist "%logOut%" echo "Name","Value" > "%logOut%"  
      echo "%%i","%%j" > "%logOut%"
    )

    ----- LogStatus.cmd -----

     

    ----- LogStatus.ps1 -----

    Function Get-LogStatusOK {
      param([string]$File)
      $OutPut = 'data;1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm'
      # vraci spravnou, nezalomenou, hodnotu
      $OutPut | write-Host
    }
     
    Function Get-LogStatusKO {
      param([string]$File)
      $OutPut = 'data;1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm'
      # vraci zalomenou hodnotu podle delky okna
      return $OutPut
    }
     
    Get-LogStatusOK -File $args[0]
    Get-LogStatusKO -File $args[0]

    ----- LogStatus.ps1 -----

     

    ----- LogStatus.csv -----

    "Name","Value"
    "data","1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm" "data","1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm12"
    "34567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm",""

    ----- LogStatus.csv -----

  • Jak spustit PowerShell script s argumenty z CommandLine

    Po spuštění Script.cmd v DOS-CMD načte Script.ps1 datový soubor Data.txt a vrátí jako výstup tři hodnoty oddělené středníkem
    (jméno parsovaného souboru;počet řádek s 'Process failed';počet řádek s 'Process success'),
    které jsou načteny FOR/F cyklem a vypsány do CommandLine jako hodnoty oddělené čárkami.

    ----- Script.cmd -----

    set DataFile=.\Data.txt 
    for /f "tokens=1,2,3 delims=;" %%a in ('powershell.exe -NoLogo -NoProfile -NonInteractive -Command "& '.\Script.ps1'" """%DataFile%"""') do (echo %%a,y%%b,%%c) 

    ----- Script.cmd -----

     

    ----- Script.ps1 -----

    Function Get-Data { 
    param([string]$File) 
      $FileContent = Get-Content $File 
      $Failed = ($FileContent | Select-String 'Process failed' | Measure-Object -Line).Lines 
      $Success= ($FileContent | Select-String 'Process success' | Measure-Object -Line).Lines 
      $OutPut = $($File+';'+$Success+';'+$Failed).Trim(' ') 
      return $OutPut 
    } 
    Get-Data -File $args[0]

    ----- Script.ps1 -----

     

    ----- Data.txt ----- 
    Data
    Process failed 
    Data 
    Process success

    ----- Data.txt -----

Powered by Community Server (Personal Edition), by Telligent Systems