Probably, the only way that always works as advertised:
.386
.model flat, stdcall
include .\delHelper.inc
.data
batname db "deleter.bat",0
batTemplate db '@echo off',10,':try',10,'del "%s"',10,'if exist "%s" goto try',10,'del %%0',10,0
.code
main proc
LOCAL tempPath[256] : BYTE
LOCAL tempLen : DWORD
LOCAL currentFile[256] : BYTE
LOCAL fileLen : DWORD
LOCAL fHandle : HANDLE
LOCAL batContents [512] : BYTE
LOCAL batLen : DWORD
LOCAL written : DWORD
LOCAL stupinfo : STARTUPINFOA
LOCAL ProcessInfo : PROCESS_INFORMATION
INVOKE GetTempPathA, 200, addr tempPath
mov tempLen, eax
invoke strcat, addr tempPath, addr batname
invoke GetModuleFileNameA, 0, addr currentFile, 256
mov fileLen, eax
; Create the .bat file
invoke CreateFileA, addr tempPath, GENERIC_WRITE,FILE_SHARE_READ,0, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
.if eax==-1
jmp @exit
.endif
mov fHandle, eax
invoke sprintf, addr batContents, addr batTemplate, addr currentFile, addr currentFile
mov batLen, eax
invoke WriteFile, fHandle, addr batContents, batLen, addr written, 0
invoke CloseHandle, fHandle
; Launch .bat file
lea edi, stupinfo
mov ecx, sizeof STARTUPINFOA
mov al, 0
cld
rep stosb
mov stupinfo.cb, sizeof STARTUPINFOA
mov stupinfo.dwFlags, STARTF_USESHOWWINDOW
invoke CreateProcessA, 0, addr tempPath, 0, 0, 1, CREATE_NO_WINDOW, 0, 0, addr stupinfo, addr ProcessInfo
invoke Closehandle, ProcessInfo.hThread
@exit:
invoke ExitProcess,0
main endp
end main