2012-03-28 10 views
8

Come posso ottenere il mio script PowerShell per stampare le informazioni in formato tabulare man mano che lo script avanza.Come creare l'effetto printf in PowerShell

In bash vorrei fare questo

printf "%s\t%-15.15s" "Locale" "Jar" 
if($verbose);then 
    printf "%-15.15s %-15.15s" "HelpSet" "Exception" 
fi 
printf "\t%s\n" "Status" 
... 
printf "%s\t%-15.15s" $locale $helpFileName 
if($verbose); then 
    printf "%-15.15s %-15.15s" "$helpSetName" ${exclusion[$helpFileName]} 
fi 
status="OK" 
... 
if ($fixed); then 
    status="CORRECTED" 
fi 
printf "\t%s\n" $status 

per ottenere

Locale Jar   HelpSet   Exception  Status 
de  help_D150  help_D150      CORRECTED 

es  help_D150  help_D150      OK 

fr  help_D150  help_D150      OK 

it  Locale folder not found 

nl  help_D150  help_D150      CORRECTED 

Grazie

risposta

16

Prova questo nella vostra console PowerShell:

"{0}`t{1,-15}{2,-15}{3,-15}" -f "Locale", "Jar", "HelpSet", "Exception" 

È possibile utilizzare string formatting abbastanza facilmente da PowerShell.

Il -f operator è una scorciatoia di PowerShell per la funzione String.Format, incluso tutto il supporto per la formattazione di tipi .NET per la formattazione di standard and custom.

+0

Con questo approccio due delle colonne condizionali vengono stampate su una nuova riga anziché sulla stessa riga – rojanu

+0

Usa una stringa di singolo formato, combinando tutte le colonne, e usa $ null o una stringa vuota per gli argomenti che non vuoi stampare. –

2

Ho accettato la risposta di Davids in quanto è quello che ho chiesto. Tuttavia, ho scelto di creare un oggetto da

try{ 
    add-type @' 
namespace FFPS { 
    public class Data { 
     public string Locale; 
     public string JarFile; 
     public string HelpSet; 
     public string CorrectName; 
     public string Status; 
    } 
} 
'@ 
} 
catch{} 

e quindi utilizzare file di formato XML per formattare come un tavolo

<?xml version="1.0" encoding="utf-16"?> 
<Configuration> 
    <ViewDefinitions> 
     <View> 
      <Name>ffps.data</Name> 
      <ViewSelectedBy> 
       <TypeName>ffps.data</TypeName> 
      </ViewSelectedBy> 
      <TableControl> 
       <TableHeaders> 
        <TableColumnHeader> 
         <Label>Locale</Label> 
         <Width>6</Width> 
        </TableColumnHeader> 
        <TableColumnHeader> 
         <Label>Jar File</Label> 
         <Width>16</Width> 
        </TableColumnHeader> 
        <TableColumnHeader> 
         <Label>Help Set</Label> 
         <Width>16</Width> 
        </TableColumnHeader> 
        <TableColumnHeader> 
         <Label>Correct Name</Label> 
         <Width>16</Width> 
        </TableColumnHeader> 
        <TableColumnHeader> 
         <Label>Status</Label> 
         <Width>100</Width> 
        </TableColumnHeader> 
       </TableHeaders> 
       <TableRowEntries> 
        <TableRowEntry> 
         <TableColumnItems> 
          <TableColumnItem> 
           <ScriptBlock>$_.Locale</ScriptBlock> 
          </TableColumnItem> 
          <TableColumnItem> 
           <ScriptBlock>$_.JarFile</ScriptBlock> 
          </TableColumnItem> 
          <TableColumnItem> 
           <ScriptBlock>$_.HelpSet</ScriptBlock> 
          </TableColumnItem> 
          <TableColumnItem> 
           <ScriptBlock>$_.CorrectName</ScriptBlock> 
          </TableColumnItem> 
          <TableColumnItem> 
           <ScriptBlock>$_.Status</ScriptBlock> 
          </TableColumnItem> 
         </TableColumnItems> 
        </TableRowEntry> 
       </TableRowEntries> 
      </TableControl> 
     </View> 
    </ViewDefinitions> 
</Configuration> 

e nel codice di fare

$currentFile = New-Object ffps.data 
$currentFile.Locale = "DE" 
$currentFile.JarFile = "JarFile.Name" 
... 
$currentFile 

alla stampa le voci