help with btm fragment

May 12, 2014
18
0
Kansas
#1
I'm running TCMD/TCC 12.11 x64 and have the following batch fragment:
Code:
@echo off
setlocal
set RESTOREDATE=1GE140513
set CASECODE=16
set CC=\0016
set CTRM=1GE
set YY=14
set MM=05
set DD=13
set NODE=1
set DAUDIO="G:\DAUDIO\1\1GE14\0513*"
set OFFSET=-12
iff %@len[%@EXPAND[%DAUDIO]] EQ 0 then
  echo.
  echo `  `No hearings found for 20%YY/%MM/%DD in courtroom %CTRM
  echo.
else
  iff "%PROG" EQ "CourtABLE" then
    set OFFSET=-24
  else
    set OFFSET=-12
  endiff
  for %SRC in (%@EXPAND[%DAUDIO]) do (
    echo.
    iff isdir %SRC%%CC then
      set DEST=C:\DAUDIO\%NODE\%@RIGHT[%OFFSET,%SRC]%CC
      if not isdir %DEST md /s /n %DEST
      echo `  `Restoring %@RIGHT[%OFFSET,%SRC]%CC, please wait...
      start /wait robocopy %SRC%%CC %DEST /e /z /is /it /r:0 /w:0 /copy:DAT
    else
      echo `  `Case code %@RIGHT[-1,%CC] not found for %@RIGHT[%OFFSET,%SRC] in courtroom %CTRM
    endiff
  )
  echo done.
  echo.
endiff
endlocal
The variables are all set prior in the batch file. I just specifically defined them here for testing. The issue I'm having is that if %DEST (C:\DAUDIO\1\1GE14\05130903.28\0016) already exists, it completely skips the "echo Restoring" and robocopy lines and just displays "Done." If %DEST doesn't exist, it creates it and copies correctly.

I don't have anything in there telling it to skip if it already exists so I'm confused. If I tell it to delete %DEST then it copies correctly every time. Also, if I remove the "if not isdir %DEST md /s /n %DEST" line then it echos the "Restoring" line but still doesn't run the robocopy.
Any ideas on this would be helpful. The goal is it should run robocopy every time regardless of whether or not the destination folder already exists.
 
May 12, 2014
18
0
Kansas
#4
@Charles Dye - DUPLICATEBUGS=Yes. I changed it to No and it now works as expected. How would I rewrite that as DO? I've played with DO in the past on other projects but could never get it to work as expected whereas FOR always has.

@TEA-Time - IF doesn't use ELSE, only IFF so I don't think that's the issue.

EDIT: OK, in cmd.exe IF uses ELSE so you may be right, @TEA-Time since I had duplicatebugs enabled. :)
 

Charles Dye

Super Moderator
Staff member
May 20, 2008
3,586
46
Albuquerque, NM
prospero.unm.edu
#7
@Charles Dye - DUPLICATEBUGS=Yes. I changed it to No and it now works as expected. How would I rewrite that as DO? I've played with DO in the past on other projects but could never get it to work as expected whereas FOR always has.
I think you'd just change the FOR line to DO SRC IN %DAUDIO, and replace the closing parenthesis with an ENDDO. (Those parentheses are your problem, since they smash everything between them onto a single line.) You may also need to think about quoting, if any of your filenames contain spaces.
 
#8
The structure of it seems OK. This works (below) correctly with v12 (32-bit). That is, I see "4" and "5" regardless of whether v:\zzz exists or not.
Code:
@echo off
setlocal
iff 1 == 2 then
   echo 1 == 2
else
   iff 2 == 2 then
     echo 2 == 2
   else
     echo 2 != 2
   endiff
   for /l %i in (1,1,3) do (
     iff isdir c:\windows then
       echo 3
       if not isdir v:\zzz md /s /n v:\zzz
       echo 4
       echo 5
     else
       echo 6
     endiff
   )
endiff
 
May 12, 2014
18
0
Kansas
#9
OK, I changed the FOR loop to DO and it seems to run correctly whether OPTION DUPLICATEBUGS is yes or no so apparently it's a bug in how cmd.exe handles FOR. Thanks for the suggestions, Charles.