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?
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
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.
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
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 n
e article.
Remarque: Utilisation de
-Split
sans parenthèses autour deGet-Content
ne fonctionnera pas depuis-Split
n'est pas un nom de paramètre pour cette commande ... ???? ♂️