Заявления PowerShell If: IF равно нескольким заданным c текстам - PullRequest
6 голосов
/ 21 февраля 2020

Доброе утро! Я работаю над сценарием и пытаюсь включить оператор IF / Else, основанный на текстовой переменной с несколькими заданными c текстовыми параметрами, и проверить путь к каталогу, который будет назван в честь переменной, и создать каталог если его не существует Например,

$text = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title,"")

If($text -match "Specific Text1") -and (!(Test-Path $Path\$text))){

new-item -ItemType directory -path $Path\$text

}
ElseIF($text -match "Specific Text2") -and (!(Test-Path $Path\$text))){

new-item -ItemType directory -path $Path\$text

}

ElseIF($text -match "Specific Text3") -and (!(Test-Path $Path\$text))){

new-item -ItemType directory -path $Path\$text

}

ElseIF($text -notmatch "Specific Text1","Specific Text2","Specific Text3"){
write-host "invalid input"
}

Я предоставляю пользователям список допустимых входных данных, которые можно ввести в текстовое поле. Когда я пытаюсь запустить скрипт, я все еще получаю сообщение о том, что папка уже существует, и она не игнорирует ее, как и должно быть.

Дополнительный вопрос: есть ли более чистый способ написать это?

Редактировать

Ниже приведен ответ, который работал идеально для меня. Спасибо всем за ваши ответы!

$text = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title,"")
$AcceptableText = @("Specific Text1","Specific Text2","Specific Text3")
If ($text -in $AcceptableText)
{
    If (!(Test-Path $Path\$text)) 
    {
        new-item -ItemType directory -path $Path\$text
    }
}
Else
{
    write-host "invalid input"
}

Ответы [ 4 ]

6 голосов
/ 21 февраля 2020

Похоже, вы пытаетесь создать каталоги, если ваш пользователь выбирает одну из 3 текстовых фраз, а каталог еще не существует, и жаловаться вашему пользователю, если они выбирают что-то, кроме 3 текстовых фраз. Я бы рассматривал каждый из этих случаев отдельно:

$text = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title,"")
$AcceptableText = @("Specific Text1","Specific Text2","Specific Text3")
If ($text -in $AcceptableText)
{
    If (!(Test-Path $Path\$text)) 
    {
        new-item -ItemType directory -path $Path\$text
    }
}
Else
{
    write-host "invalid input"
}

Или вы могли бы сначала проверить существование каталога следующим образом:

$text = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title,"")
$AcceptableText = @("Specific Text1","Specific Text2","Specific Text3")
If (!(Test-Path $Path\$text))
{
    If (($text -in $AcceptableText)) 
    {
        new-item -ItemType directory -path $Path\$text
    }
    Else
    {
        write-host "invalid input"
    }
}

РЕДАКТИРОВАТЬ: или, если вы хотите быть хитрый и избежать Test-Path (как предложено @tommymaynard), вы можете использовать следующий код (и даже исключить обертки Try | Catch, если вы не хотите проверять ошибки)

$text = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title,"")
$AcceptableText = @("Specific Text1","Specific Text2","Specific Text3")
If (($text -in $AcceptableText)) 
{
    try { mkdir -path $Path\$text -ErrorAction Stop } #Change to -ErrorAction Ignore if you remove Try|Catch
    catch [System.IO.IOException] { } #Do nothing if directory exists
    catch { Write-Error $_ }        
}
Else
{
    write-host "invalid input"
}

EDIT: Также стоит отметить, что существует множество способов Использовать PowerShell для создания папок

Несколько хороших, чистых примеров. Надеюсь, это поможет.

5 голосов
/ 21 февраля 2020

Да, вы можете :) Обратите внимание, что в операторе switch по умолчанию выполняется, когда все другие случаи не совпадают. Пожалуйста, проверьте это и дайте мне знать.

$text = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title,"")
if (!(Test-Path $Path\$text))
{
    switch ($text)
    {
        "Specific Text1"
        {
            new-item -ItemType directory -path $Path\$text
        }
        "Specific Text2"
        {
            new-item -ItemType directory -path $Path\$text
        }
        "Specific Text3"
        {
            new-item -ItemType directory -path $Path\$text
        }
        default
        {
            write-host "invalid input"
        }
    }
}
4 голосов
/ 21 февраля 2020

Начните с заботы о проверке ввода отдельно из Test-Path вызова:

$validValues = 'Specific text 1','Specific text 2','Specific text 3'
$text = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title,"")

if($validValues -notcontains $text) {
    Write-Host "Invalid output"
}
elseif(!(Test-Path -LiteralPath $path\$text)) {
    Write-Host "Item exists"
}
else {
    New-Item -ItemType Directory -LiteralPath $Path\$text
}
1 голос
/ 21 февраля 2020

Версия строки выбора:

if ('text' | select-string text,text2,text3) { 'yes' } 

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