Как поступить, если оператор сравнивает существующий файл с помощью powershell? - PullRequest
1 голос
/ 18 июня 2019

У меня есть функция с оператором if. Я хочу проверить все существование папки и файла, а затем сделать что-то.

Я попробовал этот код, я использовал -and, но он проверяет только первую папку, если первая папка не существует, он будет выполнять следующий процесс, он не проверяет одну за другой папку и файл, затем выполните следующий процесс.

Function Call
{
& .\run.cmd
start-Sleep -s 1 
$Log = Get-Content .\log.txt | Where-Object {$_.Contains("111")}

if(
    ($Log) -and 
    (![System.IO.Directory]::Exists("$FilePath\AGM")) -and 
    (![System.IO.Directory]::Exists("$FilePath\GM\JOB")) -and
    (![System.IO.Directory]::Exists("$FilePath\GM\PO")) -and
    (![System.IO.Directory]::Exists("$FilePath\GM\GM.flg"))
){
        New-Item -ItemType Directory -Force -Path "$FilePath\GM"
        New-Item -ItemType Directory -Force -Path "$FilePath\GM\JOB"
        New-Item -ItemType Directory -Force -Path "$FilePath\GM\PO"
        New-Item -ItemType File -Force -Path "$FilePath\GM\GM.flg"

    CHK_STAGE

} 
else 
{
    END
}
}

1 Ответ

1 голос
/ 18 июня 2019

Это работает точно так, как задумано. У вас есть один оператор if с несколькими пунктами, связанными с -and, что означает, что все они должны быть $true, чтобы удовлетворить условию и войти в блок.

То, что вам действительно нужно, - это четыре отдельных оператора if, каждое из которых оценивает одно условие и затем воздействует на результат этого.

if($Log) {
    if (![System.IO.Directory]::Exists("$FilePath\AGM")) {
        New-Item -ItemType Directory -Force -Path "$FilePath\GM"
    }

    if (![System.IO.Directory]::Exists("$FilePath\GM\JOB")) {
        New-Item -ItemType Directory -Force -Path "$FilePath\GM\JOB"
    }

    if (![System.IO.Directory]::Exists("$FilePath\GM\PO")) {
        New-Item -ItemType Directory -Force -Path "$FilePath\GM\PO"
    }

    if (![System.IO.Directory]::Exists("$FilePath\GM\GM.flg")) {
        New-Item -ItemType File -Force -Path "$FilePath\GM\GM.flg"
    }
}

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

Вы можете просто сделать это:

New-Item -ItemType Directory -Force -Path "$FilePath\GM"
New-Item -ItemType Directory -Force -Path "$FilePath\GM\JOB"
New-Item -ItemType Directory -Force -Path "$FilePath\GM\PO"

И вызов будет успешным независимо от того, существуют каталоги или нет. Он также вернет каждый каталог.

Для вызова файла он обнуляет файл, если он уже существует, поэтому вы можете удалить -Force и затем использовать -ErrorAction Ignore или -ErrorAction SilentlyContinue (последний все еще заполнен $Error, тогда как первый не делает ; оба преуспевают без сообщений или прерывания).

New-Item -ItemType File -Path "$FilePath\GM\GM.flg" -ErrorAction Ignore
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...