Is my java call script looping?

This topic contains 15 replies, has 2 voices, and was last updated by  Steve 10 months, 2 weeks ago.

  • Author
    Posts
  • #63009

    Steve
    Participant

    I wrote this script that runs well for 90% of what it does, which is the weird thing as it seems to have an issue completing another iteration of exactly where its successful.

    Line 56 has a typo that reads $TIMS when it should read $TPS – not sure how to change it as I don't have a github account.

    It starts a vpn. Scans ALL drives for a specifically named folder, iterates that result into a java call.

    Now the java jar functions perfectly for anything that's caught in the C:\ drive but it seems to either hang or loop or run indefinitely for any folder not base in c:\.

    I can't even kill it with sysinternals pkill or stop-process. When I try to reboot the system the whole thing hangs.

    On my test machine it seems to hang on the F:\ drive. The report the java file creates makes an F__verifier.log report (two underscores because everything in C:\ is in projects, but I chalked that up to just the log generator and not the actual launching of the java jar.

  • #63036

    Don Jones
    Keymaster

    Are the non-C: drives local?

    • #63108

      Steve
      Participant

      The one in the case I am reviewing the drive is not local, it's a usb external (which is often the case with these remote systems).

      I have a feeling the problem I'm running into is hardware related, in-part.
      Because of a couple bad reboots where the end user was required I looked into event manager and found loads of bad block messages originating from the external drive.

      My main worry was that the script would stay forever on the external drive (there is only 1 project on it).
      The script ran two scans simultaneously and completed many other projects until only the project on the external remained, and seemingly never went away.

      The fear was that somehow the script was looping the external drive. It definitely completed and did not loop the local drive projects.

      Thank you

  • #63262

    Steve
    Participant

    Just had one of those "process won't die" experiences with this script. It had been running for about 12 hours and I threw everything at it. pskill, kill, stop-process, all the fun stuff.

    I threw so many things at it in the end I have no idea what actually took it out.

    This was all after I already stopped the task in Task Manager.

    This system has a real hang-up with this script. Strange that it only effects this one thread. All the rest end with expected results.
    The java call in task manager looks perfect...

    Cannot determine if it's looping or just train-wrecking.

    About to deploy this on over a hundred systems but may need to postpone.

  • #63339

    Steve
    Participant

    Hmm.. I just got a nasty surprise

    on a hunch I removed lines 55 & 57 and changed 56 to say Write Host "$($Projects[$_]) $($TIMS[$_])"

    Now on my personal system I have a lot of drives
    The result was 10 lines from C:\, 3 lines for D:\ and 1 from H:\
    All the $Project entries are correct for all 14 results, no more or less than what was expected.
    The $TIMS entry for C:\ and H:\ are correct.
    D:\ is messed up. All 3 $TIMS entries are wrong. However they only swap within results of D:\

    The primary issue I see is that in the other drives $projects are found in the same folder structure.
    Either in the root of the drive or found within a "Projects" folder. The exception is D:\ where $Projects are found in both the root and within 1 directory below root.

    What can I do? 🙂

  • #63340

    Don Jones
    Keymaster

    So.. keep in mind I'm operating blind ;). I don't understand what "$TIMS entries are wrong" means, because I don't know what either "right" or "wrong" is meant to look like. Can you help me understand what data you're dealing with, and what outcome you're looking for?

  • #63351

    Steve
    Participant

    so the verifier needs to find the project which we can do without problem using $projects.
    The folder name of $projects is what I'm trying to find in $TIMS but perhaps I'm over complicating things.

    The end result I need is C:\Projects\12345 12345 I need those two 12345's to match exactly.
    I was trying to reference the array but it's not working out.

    Maybe a more reliable and simpler way is to extract everything after the last slash and join it to the end...

  • #63352

    Don Jones
    Keymaster

    Yeah, I'm still distinctly unclear on what the data DOES look like and what the data SHOULD look like, so I'm going to be utterly useless to you. Keep in mind, I'm not in your environment and I can't run your code.

    • #63354

      Steve
      Participant

      Sorry to waste your time by being unclear

      My data set could look like this:

      C:\112233
      C:\Projects\112233
      C:\Projects\444555
      C:\1234A
      H:\Projects\66566
      H:\987654
      I:\321654

      These results are easy to find. $projects does a good job of that. The number of results can vary (both drive letter, number of drives returned and directories, whose name's are random).

      When I pipe the results into the java file (seems to work) whatever that last folder name is I need to tag it to the end.

      So C:\1234A must follow with 1234A and nothing else or else it won't work. C:\1234A 1234A
      H:\Projects\66566 must follow with 66566 so result will be H:\Projects\66566 66566

      I hope I've been more clear.

      Thank you so much for your time.

  • #63357

    Don Jones
    Keymaster

    Ah. So you need to extract the last segment of the folder and then append a space, and the last segment, to the folder.

    function pathstuff {
     param([string[]]$folder)
     foreach ($fold in $folder) {
      $segments = split-path $fold
      write-output "$fold $($segment[-1])"
     }
    }
    

    Like that? You can call pathstuff, and pass in either a single folder or a collection of folders (strings), and get out what you want.

    • #63361

      Steve
      Participant

      I receive a NullArray error.

      I'm doing

      $Projects = Get-PSDrive -Name $redac |
           ForEach-Object{Set-Location $_.Root -EA 0; 
             Get-ChildItem -Recurse -Depth 1 | 
             Where-Object {$_.PSIsContainer} | 
             Where-Object {$_.Name -match "^[0-9]{5,6}[a-zA-Z]?$"} |
             Sort-Object -Unique |
             Foreach-Object{
                  $_.FullName
                  }
                } 
       pathstuff $projects
      

      Which will give me C:\1234A
      Cannot index into a null array.
      At line:7 char:25
      + write-output "$fold $($segment[-1])"
      + ~~~~~~~~~~~~
      + CategoryInfo : InvalidOperation: (:) [], RuntimeException
      + FullyQualifiedErrorId : NullArray

      for each result.

      I tried

      pathstuff C:\1234A

      with same result.

    • #63364

      Steve
      Participant

      Ok that was just a letter missing: Line 5 needed an 's' on $segment.

      However the result is now

      C:\1234A \ ( a space between A and \ )

    • #63370

      Steve
      Participant

      I'm aaaaalllmost there.

      function pathstuff {
       param([string[]]$folders)
       foreach ($fold in $folders) {
        $segments = split-path -Path $fold -Leaf
        write-output "$fold $($segments)"
       }
      }
      

      Now there are absolutely no mistakes – thank you Don!

      however... it repeated the last entry twice. I wonder why it would do that?

  • #63369

    Don Jones
    Keymaster

    Yeah, sorry, I've got two projects open right now and I copied you the wrong one.

    function pathstuff {
     param([string[]]$folder)
     foreach ($fold in $folder) {
      $folder = $fold -replace "/","\"
      $segments = $fold -split "\\"
      write-output "$fold $($segments[-1])"
     }
    }
    

    That should actually do it.

    • #63373

      Steve
      Participant

      This, oddly enough – had the exact same results
      It repeated the last entry twice.

      Can it be my $projects array?

      Steve

    • #63376

      Steve
      Participant

      Fixed:

       foreach ($fold in $folders |
       Sort-Object $_ -Unique
       )
      

      So both approaches work with sort-object $_ -Unique

      function pathstuff {
       param([string[]]$folders)
       foreach ($fold in $folders |
       Sort-Object $_ -Unique
       ) {
        $segments = split-path -Path $fold -Leaf
        write-output "$fold $($segments)"
       }
      }
      

      and

      function pathstuff {
       param([string[]]$folder)
       foreach ($fold in $folder | 
       Sort-Object $_ -Unique
       ) {
        $folder = $fold -replace "/","\"
        $segments = $fold -split "\\"
        write-output "$fold $($segments[-1])"
       }
      }
      

      Thanks a bunch!

You must be logged in to reply to this topic.