From e040cc99ffedde7a5f0207dff46cc83e293f1074 Mon Sep 17 00:00:00 2001 From: Mike Swanson Date: Mon, 19 Jan 2026 17:12:37 -0700 Subject: [PATCH] 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 --- DEPLOY.BAT | 30 +++++++----- DEPLOY_FROM_NAS.BAT | 30 +++++++----- DEPLOY_TEST.BAT | 30 +++++++----- check-dos-compatibility.ps1 | 2 + fix-if-blocks.ps1 | 97 +++++++++++++++++++++++++++++++++++++ 5 files changed, 153 insertions(+), 36 deletions(-) create mode 100644 fix-if-blocks.ps1 diff --git a/DEPLOY.BAT b/DEPLOY.BAT index 8169d71..4f1599f 100644 --- a/DEPLOY.BAT +++ b/DEPLOY.BAT @@ -161,14 +161,18 @@ ECHO [STEP 4/5] Installing update system files... ECHO. 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 -) +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. REM Create C:\BAT directory if it doesn't exist @@ -241,10 +245,12 @@ ECHO [STEP 5/5] Updating AUTOEXEC.BAT... ECHO. 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 -) +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 REM Append MACHINE variable to AUTOEXEC.BAT ECHO SET MACHINE=%MACHINE% >> C:\AUTOEXEC.BAT diff --git a/DEPLOY_FROM_NAS.BAT b/DEPLOY_FROM_NAS.BAT index 373d989..ab847be 100644 --- a/DEPLOY_FROM_NAS.BAT +++ b/DEPLOY_FROM_NAS.BAT @@ -161,14 +161,18 @@ ECHO [STEP 4/5] Installing update system files... ECHO. 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 -) +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. REM Create C:\BAT directory if it doesn't exist @@ -241,10 +245,12 @@ ECHO [STEP 5/5] Updating AUTOEXEC.BAT... ECHO. 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 -) +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 REM Append MACHINE variable to AUTOEXEC.BAT ECHO SET MACHINE=%MACHINE% >> C:\AUTOEXEC.BAT diff --git a/DEPLOY_TEST.BAT b/DEPLOY_TEST.BAT index 373d989..ab847be 100644 --- a/DEPLOY_TEST.BAT +++ b/DEPLOY_TEST.BAT @@ -161,14 +161,18 @@ ECHO [STEP 4/5] Installing update system files... ECHO. 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 -) +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. REM Create C:\BAT directory if it doesn't exist @@ -241,10 +245,12 @@ ECHO [STEP 5/5] Updating AUTOEXEC.BAT... ECHO. 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 -) +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 REM Append MACHINE variable to AUTOEXEC.BAT ECHO SET MACHINE=%MACHINE% >> C:\AUTOEXEC.BAT diff --git a/check-dos-compatibility.ps1 b/check-dos-compatibility.ps1 index 105c245..9ff3eae 100644 --- a/check-dos-compatibility.ps1 +++ b/check-dos-compatibility.ps1 @@ -27,6 +27,8 @@ $IncompatiblePatterns = @( @{Pattern='\|\|'; Description='|| operator - NOT in DOS 6.22'}, @{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='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='START\s+'; Description='START command - NOT in DOS 6.22'} ) diff --git a/fix-if-blocks.ps1 b/fix-if-blocks.ps1 new file mode 100644 index 0000000..cfba9e4 --- /dev/null +++ b/fix-if-blocks.ps1 @@ -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 ""