Как использовать двойной оператор if используя powershell? - PullRequest
0 голосов
/ 13 июня 2019

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

Мой пакетный скрипт

IF %ERRORLEVEL% equ 1 (
    IF NOT EXIST %FE_WKFD%\AUTO MKDIR %FE_WKFD%\AUTO
    IF NOT EXIST %FE_WKFD%\AUTO\POB MKDIR %FE_WKFD%\AUTO\POB
    IF NOT EXIST %FE_WKFD%\AUTO\file MKDIR %FE_WKFD%\AUTO\file
    IF NOT EXIST %FE_WKFD%\AUTO\Auto.txt ECHO Auto Text >> %FE_WKFD%\AUTO\Auto.txt
    GOTO B_F
)
GOTO Stop_F

МОЙ скрипт Powershell

Function GUI_Choose
{
  & "C:\Users\run.cmd"
  Start-Sleep -s 1 
  $Log = Get-Content "C:\Users\log.txt" |
    Where-Object {$_.Contains("1")}
#####This part convert from batch file#####
  if($Log -and 
    (![System.IO.Directory]::Exists("$FE_WKFD\AUTO")) -and
    (![System.IO.Directory]::Exists("$FE_WKFD\AUTO\POB")) -and
    (![System.IO.Directory]::Exists("$FE_WKFD\AUTO\file")) -and
    (![System.IO.Directory]::Exists("$FE_WKFD\AUTO\Auto.txt"))
    {
     New-Item -ItemType Directory -Force -Path "$WKFD_Path\AUTO"
     New-Item -ItemType Directory -Force -Path "$WKFD_Path\AUTO\POB"
     New-Item -ItemType Directory -Force -Path "$WKFD_Path\AUTO\file"
     New-Item -ItemType Directory -Force -Path "$WKFD_Path\AUTO\Auto.txt"
     }
    B_F #Another Function
}
else
{
    Stop_F #Another Function
}
$FE_WKFD = "C:\Users\"
if(Test-Path -Path "$FE_WKFD\Auto. txt"){
    AUTO #Another FUnction
}
else
{
    GUI_Choose
}

1 Ответ

2 голосов
/ 13 июня 2019

Оригинальный код Powershell содержит ошибку. Условия цепочки с -and примерно так,

(![System.IO.Directory]::Exists("$FE_WKFD\AUTO")) -and
(![System.IO.Directory]::Exists("$FE_WKFD\AUTO\POB")) -and

будет означать, что создавать все каталоги, только если все каталоги отсутствуют. В пакете каждый каталог тестируется и создается отдельно.

Идиоматический подход Powershell - хранить каталоги в коллекции, повторять ее и создавать то, чего не хватает. Крайний случай тестирования файла вместо dir не включается в ту же конструкцию, но имеет собственный оператор if.

Дальнейшее улучшение читабельности заключается в использовании простых условий. Вместо if something and something and so and so сначала проверьте, установлен ли $Log, а затем начните тестирование для каталогов. Вот так

if($Log) {
    # A list of subdirectories 
    $autoDirs = @("AUTO", "AUTO\POB", "AUTO\file")
    # Iterate subdir list using foreach % operator
    $autoDirs | % {
        # See if subdir exists. $_ is picked from $autoDirs
        if(-not test-path $_) {
            # ... and create if doesn't
            new-item -itemtype directory -path $(join-path $WKFD_Path $_)
        }
    }
    # Create file if it doesn't exist
    if(-not test-path "$WKFD_Path\AUTO\Auto.txt") {
        new-item -itemtype file -path "$WKFD_Path\AUTO\Auto.txt" -value "Auto text"
    }
    B_F

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