Home > Back-end >  Powershell Test-Path in loop, variable path
Powershell Test-Path in loop, variable path

Time:09-25

I started learning Powershell yesterday.

I want to write a script that run batches in multiple folders, however only if subfolder contain work_folder.

I have the following folder structure

*folder1
    --work_folder
    --script.bat
*folder2
    --script.bat
*folder3
    --script.bat
*test.ps1

powershell
cd C:\a\test\

Get-ChildItem -Path $PWD\*\script.bat | ForEach-Object {

    if ( -not ( Test-Path $PWD\*\work_folder -PathType Container ) )
    {
        Write-host "Not exist"
    return
    } else {
        Write-host "Exist"
    }
    & $_
}

If I use

    powershell
    $myPath = "$PWD\*\"

it will not work as I want.

Please give me a hint or example.

CodePudding user response:

There's a couple problems with your code. Because you use the return keyword if the work_folder directory doesn't exist, your script ends entirely on the first folder it spots like this. I think you meant to use the continue keyword, which would skip to the next iteration of the loop.

Also, you were iterating on every instance of script.bat, when you should have been iterating on every directory containing script.bat.

You can write your code a lot cleaner if you do it this way:

(Get-ChildItem -Path $PWD -Directory).FullName | ForEach-Object {

    if (Test-Path "$_/work_folder" -PathType Container)
    {
        Write-host "Exist"
        & "$_/script.bat"
    } else {
        Write-host "Not exist"
    }
}
  • Related