Почему мой оператор If с несколькими условиями -AND не работает правильно?

Я хочу выполнить несколько условий в своем выражении Powershell If и пытаюсь использовать оператор -AND для его достижения, но, похоже, он просто переходит прямо к предложению else.

В приведенном ниже коде я хочу убедиться, что в обеих папках нет файлов и что файл «watcher.txt» существует.

$Success = "C:\temp\Success"
$Failed = "C:\temp\failed"
$watcher = "C:\temp\watcher.txt"

$directoryInfo3 = get-childitem "$Success\\*" -file | Measure-Object
$directoryInfo3.count
$directoryInfo4 = get-childitem "$Failed\\*" -file | Measure-Object
$directoryInfo4.count
    if ((test-path -path $Watcher) -AND 
        ($directoryInfo3 -eq 0) -AND 
        ($directoryInfo4 -eq 0)){
         Write-host "Success folder and Failed folder are empty, and Watcher file exists."}
         else
         {Write-host "Not complete yet, rechecking folders."}

Если все три утверждения верны, я должен увидеть «Папка успеха и папка с ошибкой пусты, а файл Watcher существует».

Вместо этого я вижу «Еще не завершено, перепроверка папок». независимо от того, какое условие, даже если все три верны.

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

Alex_P 30.05.2019 08:49

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

Chris 30.05.2019 09:03

На будущее просто проверяйте каждое утверждение следующим образом: ($directoryInfo3 -eq 0) — это покажет вам False.

Robert Dyjas 30.05.2019 09:25

Вы на месте. Спасибо за это!

Chris 30.05.2019 10:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
591
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно будет вызвать $directoryInfo3.count, чтобы утверждение стало истинным. то есть:

PS C:\> $dir = gci c:\temp\ -file | measure
PS C:\> $dir


Count    : 36
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

PS C:\> $dir -eq 36
False
PS C:\> $dir.count -eq 36
True

Чертовски идеально! Я довольно сильно фейспалмил себя, я должен был это видеть. Бесконечно благодарен!

Chris 30.05.2019 10:58

Не беспокойтесь, я слишком часто грешу этим!

sysg0blin 30.05.2019 12:29

Поскольку вас не интересует количество или содержание Get-ChildItem,
вы можете использовать Test-Path для всех трех условий

## Q:\Test\2019\05\30\SO_56373080.ps1
$Success =  "C:\temp\Success"       
$Failed  =  "C:\temp\failed"       
$watcher =  "C:\temp\watcher.txt"  

if ( (Test-Path -Path $Watcher   -PathType Leaf) -AND 
    !(Test-Path -Path $Success\* -PathType Leaf) -AND 
    !(Test-Path -Path $Failed\*  -PathType Leaf)){
    Write-host "Success folder and Failed folder are empty, and Watcher file exists."
} else {
    Write-host "Not complete yet, rechecking folders."
}

Здесь ! = Не инвертирует логический результат.

Это также отличное решение, и на самом деле оно чище для той цели, для которой оно мне нужно. Параметр "Листок" я раньше не видел, удобно! Спасибо

Chris 31.05.2019 01:28

Другие вопросы по теме