fix: Remove multi-line IF blocks with parentheses from batch files

Issue: DOS 6.22 does not support multi-line IF ( ... ) blocks or
ELSE clauses, causing "Bad command or file name" errors in DEPLOY.BAT
Step 5 (Updating AUTOEXEC.BAT).

Root cause: Parentheses for multi-line IF blocks were added in later
DOS versions. DOS 6.22 only supports single-line IF statements.

Changes:
- Converted IF ( ... ) ELSE ( ... ) to GOTO label structure
- Converted IF ( nested commands ) to GOTO label structure
- Updated check-dos-compatibility.ps1 to detect IF ( ... ) syntax
- Created fix-if-blocks.ps1 automated fix script

Example fix:
BEFORE (DOS error):
  IF EXIST file (
      command1
      command2
  ) ELSE (
      command3
  )

AFTER (DOS 6.22 compatible):
  IF NOT EXIST file GOTO ELSE_LABEL
  command1
  command2
  GOTO END_LABEL
  :ELSE_LABEL
  command3
  :END_LABEL

Files modified:
- DEPLOY.BAT: Fixed 2 multi-line IF blocks (lines 164, 244)
- Added labels: NO_AUTOEXEC_BACKUP, AUTOEXEC_BACKUP_DONE, ADD_MACHINE_VAR

DOS 6.22 IF syntax:
- Single-line only: IF condition command
- No parentheses: IF condition ( ... )
- No ELSE clause: ) ELSE (
- Use GOTO for multi-step logic

Deployed to:
- D2TESTNAS: /data/test/DEPLOY.BAT (9,848 bytes)

Testing: Should resolve "Bad command or file name" error at Step 5

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-19 17:12:37 -07:00
parent 0a1233e615
commit e040cc99ff
5 changed files with 153 additions and 36 deletions

View File

@@ -161,14 +161,18 @@ ECHO [STEP 4/5] Installing update system files...
ECHO. ECHO.
REM Backup current AUTOEXEC.BAT REM Backup current AUTOEXEC.BAT
IF EXIST C:\AUTOEXEC.BAT ( IF NOT EXIST C:\AUTOEXEC.BAT GOTO NO_AUTOEXEC_BACKUP
ECHO Backing up AUTOEXEC.BAT...
COPY C:\AUTOEXEC.BAT C:\AUTOEXEC.SAV >NUL ECHO Backing up AUTOEXEC.BAT...
IF ERRORLEVEL 1 GOTO BACKUP_ERROR COPY C:\AUTOEXEC.BAT C:\AUTOEXEC.SAV >NUL
ECHO [OK] Backup created: C:\AUTOEXEC.SAV IF ERRORLEVEL 1 GOTO BACKUP_ERROR
) ELSE ( ECHO [OK] Backup created: C:\AUTOEXEC.SAV
ECHO [WARNING] No existing AUTOEXEC.BAT found GOTO AUTOEXEC_BACKUP_DONE
)
:NO_AUTOEXEC_BACKUP
ECHO [WARNING] No existing AUTOEXEC.BAT found
:AUTOEXEC_BACKUP_DONE
ECHO. ECHO.
REM Create C:\BAT directory if it doesn't exist REM Create C:\BAT directory if it doesn't exist
@@ -241,10 +245,12 @@ ECHO [STEP 5/5] Updating AUTOEXEC.BAT...
ECHO. ECHO.
REM Check if MACHINE variable already exists in AUTOEXEC.BAT REM Check if MACHINE variable already exists in AUTOEXEC.BAT
IF EXIST C:\AUTOEXEC.BAT ( IF NOT EXIST C:\AUTOEXEC.BAT GOTO ADD_MACHINE_VAR
FIND "SET MACHINE=" C:\AUTOEXEC.BAT >NUL
IF NOT ERRORLEVEL 1 GOTO MACHINE_EXISTS FIND "SET MACHINE=" C:\AUTOEXEC.BAT >NUL
) IF NOT ERRORLEVEL 1 GOTO MACHINE_EXISTS
:ADD_MACHINE_VAR
REM Append MACHINE variable to AUTOEXEC.BAT REM Append MACHINE variable to AUTOEXEC.BAT
ECHO SET MACHINE=%MACHINE% >> C:\AUTOEXEC.BAT ECHO SET MACHINE=%MACHINE% >> C:\AUTOEXEC.BAT

View File

@@ -161,14 +161,18 @@ ECHO [STEP 4/5] Installing update system files...
ECHO. ECHO.
REM Backup current AUTOEXEC.BAT REM Backup current AUTOEXEC.BAT
IF EXIST C:\AUTOEXEC.BAT ( IF NOT EXIST C:\AUTOEXEC.BAT GOTO NO_AUTOEXEC_BACKUP
ECHO Backing up AUTOEXEC.BAT...
COPY C:\AUTOEXEC.BAT C:\AUTOEXEC.SAV >NUL ECHO Backing up AUTOEXEC.BAT...
IF ERRORLEVEL 1 GOTO BACKUP_ERROR COPY C:\AUTOEXEC.BAT C:\AUTOEXEC.SAV >NUL
ECHO [OK] Backup created: C:\AUTOEXEC.SAV IF ERRORLEVEL 1 GOTO BACKUP_ERROR
) ELSE ( ECHO [OK] Backup created: C:\AUTOEXEC.SAV
ECHO [WARNING] No existing AUTOEXEC.BAT found GOTO AUTOEXEC_BACKUP_DONE
)
:NO_AUTOEXEC_BACKUP
ECHO [WARNING] No existing AUTOEXEC.BAT found
:AUTOEXEC_BACKUP_DONE
ECHO. ECHO.
REM Create C:\BAT directory if it doesn't exist REM Create C:\BAT directory if it doesn't exist
@@ -241,10 +245,12 @@ ECHO [STEP 5/5] Updating AUTOEXEC.BAT...
ECHO. ECHO.
REM Check if MACHINE variable already exists in AUTOEXEC.BAT REM Check if MACHINE variable already exists in AUTOEXEC.BAT
IF EXIST C:\AUTOEXEC.BAT ( IF NOT EXIST C:\AUTOEXEC.BAT GOTO ADD_MACHINE_VAR
FIND "SET MACHINE=" C:\AUTOEXEC.BAT >NUL
IF NOT ERRORLEVEL 1 GOTO MACHINE_EXISTS FIND "SET MACHINE=" C:\AUTOEXEC.BAT >NUL
) IF NOT ERRORLEVEL 1 GOTO MACHINE_EXISTS
:ADD_MACHINE_VAR
REM Append MACHINE variable to AUTOEXEC.BAT REM Append MACHINE variable to AUTOEXEC.BAT
ECHO SET MACHINE=%MACHINE% >> C:\AUTOEXEC.BAT ECHO SET MACHINE=%MACHINE% >> C:\AUTOEXEC.BAT

View File

@@ -161,14 +161,18 @@ ECHO [STEP 4/5] Installing update system files...
ECHO. ECHO.
REM Backup current AUTOEXEC.BAT REM Backup current AUTOEXEC.BAT
IF EXIST C:\AUTOEXEC.BAT ( IF NOT EXIST C:\AUTOEXEC.BAT GOTO NO_AUTOEXEC_BACKUP
ECHO Backing up AUTOEXEC.BAT...
COPY C:\AUTOEXEC.BAT C:\AUTOEXEC.SAV >NUL ECHO Backing up AUTOEXEC.BAT...
IF ERRORLEVEL 1 GOTO BACKUP_ERROR COPY C:\AUTOEXEC.BAT C:\AUTOEXEC.SAV >NUL
ECHO [OK] Backup created: C:\AUTOEXEC.SAV IF ERRORLEVEL 1 GOTO BACKUP_ERROR
) ELSE ( ECHO [OK] Backup created: C:\AUTOEXEC.SAV
ECHO [WARNING] No existing AUTOEXEC.BAT found GOTO AUTOEXEC_BACKUP_DONE
)
:NO_AUTOEXEC_BACKUP
ECHO [WARNING] No existing AUTOEXEC.BAT found
:AUTOEXEC_BACKUP_DONE
ECHO. ECHO.
REM Create C:\BAT directory if it doesn't exist REM Create C:\BAT directory if it doesn't exist
@@ -241,10 +245,12 @@ ECHO [STEP 5/5] Updating AUTOEXEC.BAT...
ECHO. ECHO.
REM Check if MACHINE variable already exists in AUTOEXEC.BAT REM Check if MACHINE variable already exists in AUTOEXEC.BAT
IF EXIST C:\AUTOEXEC.BAT ( IF NOT EXIST C:\AUTOEXEC.BAT GOTO ADD_MACHINE_VAR
FIND "SET MACHINE=" C:\AUTOEXEC.BAT >NUL
IF NOT ERRORLEVEL 1 GOTO MACHINE_EXISTS FIND "SET MACHINE=" C:\AUTOEXEC.BAT >NUL
) IF NOT ERRORLEVEL 1 GOTO MACHINE_EXISTS
:ADD_MACHINE_VAR
REM Append MACHINE variable to AUTOEXEC.BAT REM Append MACHINE variable to AUTOEXEC.BAT
ECHO SET MACHINE=%MACHINE% >> C:\AUTOEXEC.BAT ECHO SET MACHINE=%MACHINE% >> C:\AUTOEXEC.BAT

View File

@@ -27,6 +27,8 @@ $IncompatiblePatterns = @(
@{Pattern='\|\|'; Description='|| operator - NOT in DOS 6.22'}, @{Pattern='\|\|'; Description='|| operator - NOT in DOS 6.22'},
@{Pattern='\\NUL(?!\s|$)'; Description='\NUL as filename - INVALID (use \*.* for directory test)'}, @{Pattern='\\NUL(?!\s|$)'; Description='\NUL as filename - INVALID (use \*.* for directory test)'},
@{Pattern='XCOPY.*\/Q'; Description='XCOPY /Q (quiet mode) - NOT in DOS 6.22'}, @{Pattern='XCOPY.*\/Q'; Description='XCOPY /Q (quiet mode) - NOT in DOS 6.22'},
@{Pattern='IF.*\('; Description='IF ( ... ) multi-line blocks - NOT in DOS 6.22 (use GOTO labels)'},
@{Pattern='\)\s*ELSE\s*\('; Description=') ELSE ( clause - NOT in DOS 6.22 (use GOTO labels)'},
@{Pattern='CHOICE\s+/[A-Z]'; Description='CHOICE with options - Check if CHOICE.COM available'}, @{Pattern='CHOICE\s+/[A-Z]'; Description='CHOICE with options - Check if CHOICE.COM available'},
@{Pattern='START\s+'; Description='START command - NOT in DOS 6.22'} @{Pattern='START\s+'; Description='START command - NOT in DOS 6.22'}
) )

97
fix-if-blocks.ps1 Normal file
View File

@@ -0,0 +1,97 @@
# Fix multi-line IF blocks with parentheses - not supported in DOS 6.22
# Convert to single-line IF statements with GOTO labels
$BATFiles = @(
"DEPLOY.BAT",
"DEPLOY_VERIFY.BAT",
"DEPLOY_TEST.BAT",
"DEPLOY_FROM_NAS.BAT",
"DEPLOY_FROM_AD2.BAT"
)
Write-Host "[INFO] Fixing multi-line IF blocks (not in DOS 6.22)" -ForegroundColor Cyan
Write-Host ""
foreach ($File in $BATFiles) {
$FilePath = "D:\ClaudeTools\$File"
if (-not (Test-Path $FilePath)) {
Write-Host "[SKIP] $File - not found" -ForegroundColor Yellow
continue
}
Write-Host "Processing: $File" -ForegroundColor White
$Content = Get-Content $FilePath -Raw
# Fix 1: AUTOEXEC.BAT backup block (lines 164-171)
# Convert multi-line IF ( ... ) ELSE ( ... ) to single-line IF with GOTO
$OldBlock1 = @'
REM Backup current AUTOEXEC.BAT
IF EXIST C:\AUTOEXEC.BAT (
ECHO Backing up AUTOEXEC.BAT...
COPY C:\AUTOEXEC.BAT C:\AUTOEXEC.SAV >NUL
IF ERRORLEVEL 1 GOTO BACKUP_ERROR
ECHO [OK] Backup created: C:\AUTOEXEC.SAV
) ELSE (
ECHO [WARNING] No existing AUTOEXEC.BAT found
)
ECHO.
'@
$NewBlock1 = @'
REM Backup current AUTOEXEC.BAT
IF NOT EXIST C:\AUTOEXEC.BAT GOTO NO_AUTOEXEC_BACKUP
ECHO Backing up AUTOEXEC.BAT...
COPY C:\AUTOEXEC.BAT C:\AUTOEXEC.SAV >NUL
IF ERRORLEVEL 1 GOTO BACKUP_ERROR
ECHO [OK] Backup created: C:\AUTOEXEC.SAV
GOTO AUTOEXEC_BACKUP_DONE
:NO_AUTOEXEC_BACKUP
ECHO [WARNING] No existing AUTOEXEC.BAT found
:AUTOEXEC_BACKUP_DONE
ECHO.
'@
# Fix 2: MACHINE variable check block (lines 244-247)
# Convert multi-line IF ( ... ) to single-line IF with GOTO
$OldBlock2 = @'
REM Check if MACHINE variable already exists in AUTOEXEC.BAT
IF EXIST C:\AUTOEXEC.BAT (
FIND "SET MACHINE=" C:\AUTOEXEC.BAT >NUL
IF NOT ERRORLEVEL 1 GOTO MACHINE_EXISTS
)
'@
$NewBlock2 = @'
REM Check if MACHINE variable already exists in AUTOEXEC.BAT
IF NOT EXIST C:\AUTOEXEC.BAT GOTO ADD_MACHINE_VAR
FIND "SET MACHINE=" C:\AUTOEXEC.BAT >NUL
IF NOT ERRORLEVEL 1 GOTO MACHINE_EXISTS
:ADD_MACHINE_VAR
'@
$Content = $Content -replace [regex]::Escape($OldBlock1), $NewBlock1
$Content = $Content -replace [regex]::Escape($OldBlock2), $NewBlock2
Set-Content $FilePath $Content -NoNewline
Write-Host " [OK] Fixed multi-line IF blocks" -ForegroundColor Green
}
Write-Host ""
Write-Host "[SUCCESS] All IF blocks converted to DOS 6.22 syntax" -ForegroundColor Green
Write-Host ""
Write-Host "DOS 6.22 IF syntax:" -ForegroundColor Cyan
Write-Host " IF condition command (single line only)" -ForegroundColor White
Write-Host " IF condition GOTO label (for multi-step logic)" -ForegroundColor White
Write-Host ""
Write-Host " NOT SUPPORTED:" -ForegroundColor Red
Write-Host " IF condition ( ... ) (parentheses)" -ForegroundColor Red
Write-Host " IF condition ... ELSE ... (ELSE clause)" -ForegroundColor Red
Write-Host ""