Я хочу выполнить несколько условий в своем выражении 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 существует».
Вместо этого я вижу «Еще не завершено, перепроверка папок». независимо от того, какое условие, даже если все три верны.
Да, безусловно, все верно. Я только что дважды проверил орфографию файлов и папок, и все они верны. Я сделал все условия ложными, чтобы увидеть, что произойдет, но все равно получил тот же результат. Я также воссоздал папки на случай, если были какие-то скрытые файлы, но все равно не повезло.
На будущее просто проверяйте каждое утверждение следующим образом: ($directoryInfo3 -eq 0)
— это покажет вам False
.
Вы на месте. Спасибо за это!
Вам нужно будет вызвать $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
Чертовски идеально! Я довольно сильно фейспалмил себя, я должен был это видеть. Бесконечно благодарен!
Не беспокойтесь, я слишком часто грешу этим!
Поскольку вас не интересует количество или содержание 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."
}
Здесь !
= Не инвертирует логический результат.
Это также отличное решение, и на самом деле оно чище для той цели, для которой оно мне нужно. Параметр "Листок" я раньше не видел, удобно! Спасибо
Вы уверены, что верно второе и третье условие? Вы пробовали три условия и точно знали, что каждое условие верно? Ваши условия И выглядят хорошо, но, вероятно, ваши условия не равны истине.