In OS/2 WARP 4 you may get the error SYS1186 while trying to copy files
with odd characters in their names (e.g. "²1■%E■.AX■") using XCOPY.
To resolve this problem, you must change the codepage to 437. To do this
either issue the command CHCP 437 for a temporary change, or change
the codepage line in the file CONFIG.SYS to CODEPAGE=437,850 and
reboot the system to make the change permanent.
Please note that I cannot reproduce this error on my system with WARP 4 and Fixpack #1.
---------- * ----------
According to the OS/2 online help, XCOPY should return a return code of 2 if it cannot access one or more source or target files. In reality (OS/2 WARP 3 with Fixpack #17) XCOPY returns 0 in this case.
(Note: I've tried this again with WARP 4 Fixpack #5 - and at least in this environment XCOPY does return a return code of 2 in case of an error.)
To get around this bug, you can use a REXX program (see below) to call XCOPY, redirect its output to the REXX queue and check the contents of the REXX queue afterwards to get the results of the XCOPY command (see also The COPY command).
Warning: XCOPY is a version dependent program! Always use the XCOPY.EXE from the current active OS/2 version!!!
/* sample REXX cmd to get around some of the bugs of XCOPY */ /* init global variables */ sourceFiles = "*.*" targetFiles = "test1\*.*" /* flush the current REXX queue */ do i = 1 to queued(); parse pull; end; say "Now calling xcopy to copy " || , sourceFiles || " to " || targetFiles || " ..." /* execute XCOPY and redirect STDOUT and STDERR */ /* into the REXX queue (because the filenames go */ /* to STDOUT but the error messages go to STDERR) */ "@xcopy" sourceFiles TargetFiles "2>>&1" "| rxqueue" say " ... done. The RC of XCOPY is " || rc || "." say say "Now checking the result ... " say /* get no. of lines in the REXX queue */ qCount = queued() /* number of files copied */ filesCopied = 0 /* no. of files not copied due to source file */ /* access errors */ sourceFileErrors = 0 /* no. of files not copied due to target file */ /* access errors */ targetFileErrors = 0 /* no. of files not copied due to unknown errors */ unknownErrors = 0 /* error marker for the loop */ errorFound = 0 do i = 1 to qCount parse upper pull curLine curLine = strip( curLine ) if curLine = "" then iterate select when errorFound = "SourceError" then do sourceFileErrors = sourceFileErrors + 1 say " Error: XCOPY could not access the source file " say " " || curLine errorFound = "" end /* when */ when errorFound = "TargetError" then do targetFileErrors = targetFileErrors + 1 say " Error: XCOPY could not access the target file " say " " || curLine errorFound = "" end /* when */ when word( errorFound,1 ) = "UnknownError" then do unknownErrors = unknownErrors + 1 /* check if the next line is the name of a file */ if stream( curLine, "c", "QUERY EXISTS" ) <> "" then do say " Error: XCOPY retrieved the error " || , word( errorFound,2 ) || " accessing the file " say " " || curLine end /* if stream( ... */ else say " Error: XCOPY retrieved the error " || , word( errorFound,2 ) errorFound = "" end /* when */ /* SYS1186 - source file access error */ when left( curLine,7 ) = "SYS1186" then errorFound = "SourceError" /* SYS1187 - target file access error */ when left( curLine,7 ) = "SYS1187" then errorFound = "TargetError" when left( curLine,3 ) = "SYS" & substr( curLine,8,1 ) = ":" then errorFound = "UnknownError" substr( curLine,1,7 ) otherwise /* ignore status output of XCOPY */ if stream( curLine, 'c', 'QUERY EXISTS' ) <> '' then filesCopied = filesCopied + 1 end /* select */ end /* do i = 1 to qCount */ say say "XCOPY copied " || filesCopied || " file(s)." filesNotCopied = sourceFileErrors + targetFileErrors + unknownErrors if filesNotCopied <> 0 then do if filesNotCopied <> 1 then say filesNotCopied || " file(s) were not copied due to access errors." else say filesNotCopied || " file was not copied due to access errors." say " " || sourceFileErrors || , " file(s) because of source file access errors, " say " " || targetFileErrors || , " file(s) because of target file access errors " say " and " || unknownErrors || " file(s) because of unknown errors." end /* if filesNotCopied <> 0 then */ else do say " No errors found." end /* else */ exit 0