Chris
Chris

Reputation: 219

Do..Until on a never ending loop

I have written a Do..Until statement to check whether a file exists. If the file is not there, it waits a couple seconds and checks again.

It is supposed to end when the file appears. I have tested by running the script without the file and then adding it in the folder as the script is running.

Instead of ending, it continues to loop endlessly. Can anyone see what I have missed?

$path = test-path "C:\Temp\test.txt"
do {    
    if (!($path)) {
        Write-Host "Not here yet..."
        Start-Sleep -s 3
    }
} until($path)

Write-Host "Files here now"
Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

Upvotes: 0

Views: 3381

Answers (2)

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200193

The Test-Path statement is evaluated in the line

$path = Test-Path "C:\Temp\test.txt"

After that the variable $path contains the boolean result of the evaluation. Put the actual check in your conditions:

$path = "C:\Temp\test.txt"
do { 
    if (-not (Test-Path $path)) {
        Write-Host "Not here yet..."
        Start-Sleep -s 3
    }
} until (Test-Path $path)

or define it as a function that you call in your conditions:

function Test-File {
    Test-Path "C:\Temp\test.txt"
}

do { 
    if (-not (Test-File)) {
        Write-Host "Not here yet..."
        Start-Sleep -s 3
    }
} until (Test-File)

Upvotes: 2

Chris
Chris

Reputation: 219

OK, figured it out 3 minutes after posting this (and an hour before that of frustration!).

I needed to put the variable INSIDE the Do..Until statement. Like so:

do{ 
    $path = test-path "C:\Temp\test.txt"
    if (!($path))   
        {Write-Host "Not here yet..."
        start-sleep -s 3}       
    }
until($path)
    Write-Host "Files here now"
    Write-Host "Press any key to continue ..."
    $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

Upvotes: 1

Related Questions