Слишком много, если еще заявления - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь проверить, существует ли строка «03-22-2019» (или нет, и показать результат в выходных данных), файл имеет «.sql» или «.txt».

execution\development\process.sql
insert.sql
production\logs.txt
restore.sql
rebuild.txt

Я пробую приведенный ниже код, но я сделал слишком много if else.Указанный выше путь к файлу хранится в переменной $paths.Мне нужно разделить путь с помощью "\" и заставить последнюю часть пути сделать что-то еще.

if ($paths -like "*.sql") {
    if ($paths.Contains("\")) {
        $last = $paths.Split("\")[-1] #get the last part of the path
        $result = "03-22-2019" #get this date from some where else
        if ($result) {
            #check if pattern string exists in that file.
            $SEL = Select-String -Path <path location> -Pattern $result
            if ($SEL -ne $null) {
                Write-Host "`n $last Contains Matching date "
            } else {
                Write-Host "`n $last Does not Contains date"
            }
        } else {
            Write-Host "`ndate field is blank"
        }
    } else {
        $result = "03-22-2019" #get this date from some where else
        if ($result) {
            #check if pattern string exists in that file.
            $SEL = Select-String -Path <path location> -Pattern $result
            if ($SEL -ne $null) {
                Write-Host "`n $last Contains Matching date "
            } else {
                Write-Host "`n $last Does not Contains date"
            }
        } else {
            Write-Host "`ndate field is blank"
        }
    }
} elseIf ($paths -like "*.txt") {
    if ($paths.Contains("\")) {
        $last = $paths.Split("\")[-1] #get the last part of the path
        $result = "03-22-2019" #get this date from some where else
        if ($result) {
            #check if pattern string exists in that file.
            $SEL = Select-String -Path <path location> -Pattern $result
            if ($SEL -ne $null) {
                Write-Host "`n $last Contains Matching date "
            } else {
                Write-Host "`n $last Does not Contains date"
            }
        } else {
            Write-Host "`ndate field is blank"
        }
    } else {
        $result = "03-22-2019" #get this date from some where else
        if ($result) {
            #check if pattern string exists in that file.
            $SEL = Select-String -Path <path location> -Pattern $result
            if ($SEL -ne $null) {
                Write-Host "`n $last Contains Matching date "
            } else {
                Write-Host "`n $last Does not Contains date"
            }
        } else {
            Write-Host "`ndate field is blank"
        }
    }
} else {
    Write-Host "other file types"
}

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Я бы сделал это немного проще, ниже приведен пример, чтобы определить, содержит ли файл дату:

$paths = @("c:\path1","c:\path2\subdir")
ForEach ($path in $paths) {
    $files = Get-ChildItem -LiteralPath $path -file -include "*.sql","*.txt"
    $last = ($path -split "\\")[-1] # contains the last part of the path
    $output = ForEach ($file in $files) {
        If (Select-String -path $file -pattern "03-22-2019") {
        "$($file.fullname) contains the date."
        }
        else {
        "$($file.fullname) does not contain the date."
        }
    }
}

$output # outputs whether or not a file has the date string

Внешний цикл ForEach проходит по путям в $paths.Внутри этого цикла вы можете делать то, что вам нужно для каждого пути $path.Я использовал $last для хранения последней части пути в текущей итерации.Вы еще не сказали, что с этим делать.

Внутренний ForEach проверяет каждый .txt и .sql на текст даты 03-22-2019,$output хранит строку, указывающую, содержит ли каждый файл .txt и .sql строку даты.

Если ваши пути содержат имена файлов, вы можете использоватьСледующие альтернативы для получения имени файла (последняя часть пути):

$path | split-path -leaf # inside of the outer ForEach loop
# Or
$file.name # inside of the inner ForEach loop
0 голосов
/ 22 марта 2019

Похоже, вам следует начинать с foreach после переменной $ paths, например:

foreach ($path in $paths) {
    if ($path -like "*.sql") {    #Note the use of one single item in the $paths array you have
        $last = $path.split("\")[-1]
        $result = #Whatever method you want to use to return a DateTime object
        if ($result) { #### Now, this line doesn't make any sense. Do you want to compare a date to an older date or something? Maybe something like "if ($result -ge (Get-Date).addDays(-1) )
        { # Do your stuff }

Делать что-то вроде:

if ($paths -like "*.sql")

Не работает, потому что $ paths являетсямассив, и вы делаете сравнение строк, и никогда не встретятся два.Теперь, если вы пытаетесь найти, находится ли строка внутри файла, вы должны использовать что-то вроде «Get-Content» или «Import-Csv»

. Вы можете использовать командлет «Get-Date», чтобы получитьмного разных форматов для даты.Читайте об этом здесь .Если вы пытаетесь сравнить несколько дат с несколькими файлами, я бы начал с цикла for для файлов, как я делал там, а затем с цикла for для каждого файла для массива дат.Может быть, что-то вроде этого:

foreach ($path in $paths) {
    foreach ($date in $dates) { 
        # Get the contents of a file and store it in a variable
        # Search for the string in that variable and store the results in a variable
        # Write to the console
    } # End foreach ($date in $dates)
} # End foreach ($path in $paths)

Отправьте еще немного обновленного кода и посмотрим, что вы придумали.

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