Это работает точно так, как задумано. У вас есть один оператор 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