web-dev-qa-db-fra.com

Quel est l'équivalent de la commande * Nix 'cut' dans Powershell?

J'ai le contenu suivant dans un fichier de configuration (sample.cfg),

Time_Zone_Variance(Mins):300
Alert_Interval(Mins):2
Server:10.0.0.9
Port:1840

J'essaie de stocker chacune des valeurs après le : en utilisant split dans PowerShell. mais je ne suis pas capable de produire une sortie requise.

Quelqu'un peut-il me dire comment utiliser PowerShell split pour le problème ci-dessus?

14
HamTheAstroChimp

Vous pouvez lire le contenu du fichier en utilisant Get-Content, puis dirigez chaque ligne par ForEach-Object, puis utilisez la commande split sur chaque ligne, en prenant le deuxième élément du tableau comme suit:

$filename = "sample.cfg"

Get-Content $filename | ForEach-Object {
    $_.split(":")[1]
}

Sortie

300
2
10.0.0.9
1840

Mise à jour

Je préfère l'approche de @AnsgarWiechers, mais si vous avez vraiment besoin de valeurs spécifiquement nommées, vous pouvez créer une table de hachage et remplacer le nom par la valeur:

$configValues = @{
    hour    = "Time_Zone_Variance(Mins)"
    min     = "Alert_Interval(Mins)"
    server  = "Server"
    port    = "Port"
}

Get-Content $filename | ForEach-Object {

    # Courtesy of Ansgar Wiechers
    $key, $value = $_ -split ':', 2

    foreach($configValuesKey in $($configValues.keys)) {
        if ($configValues[$configValuesKey] -eq $key)
        {
            $configValues[$configValuesKey] = $value
        }
    }
}

write-Host "`nAll Values:"
$configValues
write-Host "`nIndividual value:"
$configValues.port

Sortie

All Values:

Name                           Value                                                                                             
----                           -----                                                                                             
port                           1840                                                                                              
min                            2                                                                                                 
server                         10.0.0.9                                                                                          
hour                           300                                                                                               

Individual value:
1840
12
David Martin

Je suppose que vous ne voulez pas simplement diviser les lignes, mais créer des paires clé/valeur. Cela pourrait être réalisé comme ceci:

$config = @{}
Get-Content 'C:\path\to\sample.cfg' | % {
  $key, $value = $_ -split ':', 2
  $config[$key] = $value
}

Vous pouvez également utiliser le ConvertFrom-StringData applet de commande:

Get-Content 'C:\path\to\sample.cfg' | % {
  ConvertFrom-StringData ($_ -replace ':','=')
}

Le -replace une opération est nécessaire, car ConvertFrom-StringData s'attend à ce que la clé et la valeur soient séparées par =. Si vous pouviez changer le délimiteur dans le fichier de configuration de : à =, vous pouvez utiliser ConvertFrom-StringData $_ sans remplacement.

4
Ansgar Wiechers

Comment c'est?

function cut {
  param(
    [Parameter(ValueFromPipeline=$True)] [string]$inputobject,
    [string]$delimiter='\s+',
    [string[]]$field
  )

  process {
    if ($field -eq $null) { $inputobject -split $delimiter } else {
      ($inputobject -split $delimiter)[$field] }
  }
}


PS C:\> 'hi:there' | cut -f 0 -d :
hi

PS C:\> 'hi:there' | cut -f 1 -d :
there

PS C:\> 'hi:there' | cut -f 0,1 -d :
hi
there

PS C:\> 'hi:::there' | cut -f 0 -d :+
hi

PS C:\> 'hi   there' | cut
hi
there
4
js2010

Pour une syntaxe plus succinte, cela fera également l'affaire:

((Get-Content "your-file.txt") -Split ":")[1]

Donc, l'astuce pour utiliser le -Split la méthode consiste à renvoyer un objet String par Get-Content (l'alias cat peut également être utilisé, en fait), et à partir du String[] objet, vous pouvez utiliser les crochets pour extraire le ne article.

Remarque: Utilisation de -Split sans parenthèses autour de Get-Content ne fonctionnera pas depuis -Split n'est pas un nom de paramètre pour cette commande ... ???? ‍♂️

2