Как выбрать массив данных в сценарии powershell? - PullRequest
0 голосов
/ 07 января 2020

Я не разработчик PowerShell. Поэтому мне нужна помощь экспертов здесь. У меня есть скрипт, который делает все, что я должен, но сейчас это расширение я не могу реализовать.

В настоящее время мы читаем следующие строки из текстового файла в переменную VmList:

LineA
LineB
LineC
LineD

Они передаются следующим образом:

$Lines = Get-Content $IniValue

Затем они снова в строках.

Теперь мы хотим удалить строки из переменной $ Lines в зависимости от дня недели.

Для этого мы изменили строки следующим образом:

LineA,1,1,1,1,1,1,1
LineB,1,0,1,1,1,1,1
LineC,1,1,1,1,1,1,1
LineD,1,0,1,1,0,1,1

,1,1,1,1,1,1,1 обозначает один будний день каждый. Итак, первое число 1 означает понедельник, второе - вторник.

In line A, Tuesday is therefore set to 1
So in line B the Tuesday is set to 0
So in line C the Tuesday is set to 1
So in line D the Tuesday is set to 0

Итак, в понедельник, среду, четверг, субботу, воскресенье строки A, B, C, D в переменной $ Lines должны быть сохранены.

Таким образом, для выполнения во вторник, lineB и lineD должны быть удалены из переменной $ Lines.

Таким образом, для выполнения в пятницу, только lineD должна быть удалена из переменная $ Lines.

После очистки строк добавленные цепочки, 1,1,1,1,1,1,1,1, должны быть удалены из всех строк,

Большое спасибо за вашу помощь!

Ответы [ 4 ]

0 голосов
/ 07 января 2020

Если вы хотите указать имя строки и данные недели (все столбцы), вы можете сделать следующее:

Get-Content File | Where {
    ($_ -split ',' | Select -Skip 1)[(Get-Date -uformat %u)-1] -eq 1}

%u - это спецификатор формата для номера дня недели с понедельником, равным 1. Воскресенье 0, вы должны позаботиться об этом особом случае. Получив индекс [-1] для разбиения, получает последний элемент в массиве разбиения, то есть воскресенье (0-1).

Если вы хотите вернуть только первый столбец данных, тогда js2010's ответ это самый простой способ go.

0 голосов
/ 07 января 2020

Я использую здесь строку для демонстрации.
В реальной жизни вы хотите прочитать это из файла с $Lines = Get-Content $IniValue

$lines = @"
LineA,1,1,1,1,1,1,1
LineB,1,0,1,1,1,1,1
LineC,1,1,1,1,1,1,1
LineD,1,0,1,1,0,1,1
"@ -split '\r?\n'

# get today's DayOfWeek
$today = (Get-Date).DayOfWeek

$lines | ForEach-Object {
    $parts = $_ -split ','
    # if Sunday, the index should be 7, otherwise the integer number of todays DayOfWeek
    $index = if ($today -eq 'Sunday') { 7 } else { [int]$today }
    if ([int]$parts[$index]) { $parts[0] }
}

Вывод на вторник:

LineA
LineC

Причина использования [int] в if ([int]$parts[$index]) состоит в том, что числа, выделенные из строки, могут выглядеть как числа, но на самом деле это строки "0" или "1". Без приведения к целому числу if будет проверять if ("0") или if ("1"), и поскольку обе строки не являются пустыми, результатом всегда будет True.

0 голосов
/ 07 января 2020

Я бы сделал это так. Обрабатывайте входной файл как csv или сделайте его csv. Сегодня вторник.

$lines = import-csv $inivalue -header vm,monday,tuesday,wednesday,thursday,friday,saturday,sunday
$day = (get-date).DayOfWeek
$lines | where { $_.$day -eq 1 } | ft


vm    monday tuesday wednesday thursday friday saturday sunday
--    ------ ------- --------- -------- ------ -------- ------
LineA 1      1       1         1        1      1        1
LineC 1      1       1         1        1      1        1

И затем, чтобы получить список виртуальных машин:

$lines | where { $_.$day -eq 1 } | foreach vm


LineA
LineC

Я пытался сделать "где день", но он работает только с int:

$lines | where { [int]$_.$day } | ft


vm    monday tuesday wednesday thursday friday saturday sunday
--    ------ ------- --------- -------- ------ -------- ------
LineA 1      1       1         1        1      1        1
LineC 1      1       1         1        1      1        1
0 голосов
/ 07 января 2020

Попробуйте это:

Add-Type -AssemblyName System.Collections

# Generic list => better than array
[System.Collections.Generic.List[string]]$dayList = @()

# input file
$csvFile    = 'C:\test\weekdays.csv' 

# read file to generic list
$dayList    = [System.IO.File]::ReadLines( $csvFile )

# get current weekday as a number
$currentDay = (Get-Date).DayOfWeek.value__

# remove all records with 0 on current day
[void]$daylist.RemoveAll( {param($s) @($s -split ',')[$currentDay-1] -eq '0'}  )

# show list
$daylist
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...