Xulong

Script hanging after FileCopy function successfully ran

16 posts in this topic

#1 ·  Posted (edited)

I have a script which is copying one file (the latest file among a bunch of structured folders) from one network device to another network device.

The weird thing is the file copied successfully to the destination folder right after the FileCopy command ran but the script is hanging for another few minutes until it return with exit code 0.

Below is my script:

#include <MsgBoxConstants.au3>
#include <File.au3>
#include <Array.au3>
#include <FileConstants.au3>

copyfile()
Func copyfile()

Local $testLogFile = FileOpen(@ScriptDir & "\CopyMSI", 1)
Local $BuildArtifacts = "\\vm-build\BuildArtifacts"
Local $dServer = "\\VM-DEV\c$\Users\Administrator\Desktop"

Send("#r")
WinWaitActive("Run")
ControlSend("Run", "", 1001, $BuildArtifacts)
ControlClick("Run", "OK", 1)
_FileWriteLog($testLogFile, "Opened Builds folder")

;trying to get the latest build folder and grab the latest msi file for copying
WinWaitActive("BuildArtifacts")
Local $FolderList = _FileListToArray($BuildArtifacts, "Grand-4.*")
_ArraySort($FolderList, 1)
Local $latestSEbuild = $FolderList[0]
Sleep (5000)
WinClose("BuildArtifacts")

Local $sServer = $BuildArtifacts & '\' & $latestSEbuild & '\G4.msi'
; start copying file from build to destination folder

FileCopy($sServer, $dServer, $FC_OVERWRITE)
_FileWriteLog($testLogFile, "Copied MSI")
EndFunc

 

Edited by Xulong

Share this post


Link to post
Share on other sites



How large is the MSI? And how long does it take you to copy that file manually? Is it a slow link? FileCopy is going to stop the script until it finishes, so if it is a large file it may take a few seconds. Longer if it is a slow link.


√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites
1 minute ago, JLogan3o13 said:

How large is the MSI? And how long does it take you to copy that file manually? Is it a slow link? FileCopy is going to stop the script until it finishes, so if it is a large file it may take a few seconds. Longer if it is a slow link.

The file is not large only under 100MB, I can see the file being successfully copied over using the script but just the script won't return exit code after successfully copied over and hanging there for a few minutes before it returns the exit code.

Share this post


Link to post
Share on other sites

Is it hanging before or after the _filewritelog?


√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites
4 hours ago, JLogan3o13 said:

Is it hanging before or after the _filewritelog?

It is hanging before the _filewritelog.

Share this post


Link to post
Share on other sites

Can you try something like this (untested), uses the default Windows copy process with overwrite, Jos wrote the _FileCopy function:

#include <MsgBoxConstants.au3>
#include <File.au3>
#include <Array.au3>
#include <FileConstants.au3>

CopyFile()

Func copyfile()
    Local $sLogFile = FileOpen(@ScriptDir & "\CopyMSI.log", 1)
    Local $BuildArtifacts = "\\vm-build\BuildArtifacts"
    Local $dServer = "\\VM-DEV\c$\Users\Administrator\Desktop"

    _FileWriteLog($sLogFile, "Opened Builds folder")

    Local $FolderList = _FileListToArrayRec($BuildArtifacts, "Grand-4.*", 2, 0, 1, 2)

    Local $sServer = $FolderList[0] & '\G4.msi'

    _FileCopy($sServer, $dServer)
    _FileWriteLog($sLogFile, "Copied MSI")
EndFunc

Func _FileCopy($sSource, $sTarget)
    Local $FOF_RESPOND_YES = 16
    $hWinShell = ObjCreate("Shell.Application")
    $hWinShell.namespace($sTarget).CopyHere($sSource, $FOF_RESPOND_YES)
EndFunc

 

Share this post


Link to post
Share on other sites

@Subz Thanks for the script. It seems not copying file.

Share this post


Link to post
Share on other sites

Can you try and add ConsoleWrite above _FIleCopy with ConsoleWrite($sServer, $dServer) and make sure the paths are correct?

Share this post


Link to post
Share on other sites
1 hour ago, Subz said:

Can you try and add ConsoleWrite above _FIleCopy with ConsoleWrite($sServer, $dServer) and make sure the paths are correct?

I used MSGBOX which gives me the correct path but when I use the above ConsoleWrite it gives me error incorrect parameters.

So I tried my script again and it now returns the exit code straight after the FileCopy. But it hangs again when I use the script with CruiseControl as an executable task.

Share this post


Link to post
Share on other sites

#10 ·  Posted

Can you run the code below, can you send through screenshot of _ArrayDisplay and also the output from ConsoleWrite

#include <MsgBoxConstants.au3>
#include <File.au3>
#include <Array.au3>
#include <FileConstants.au3>

CopyFile()

Func copyfile()
    Local $sLogFile = FileOpen(@ScriptDir & "\CopyMSI.log", 1)
    Local $BuildArtifacts = "\\vm-build\BuildArtifacts"
    Local $dServer = "\\VM-DEV\c$\Users\Administrator\Desktop"

    _FileWriteLog($sLogFile, "Opened Builds folder")

    Local $FolderList = _FileListToArrayRec($BuildArtifacts, "Grand-4.*", 2, 0, 1, 2)
    _ArrayDisplay($FolderList)

    Local $sServer = $FolderList[0] & '\G4.msi'
    ConsoleWrite('Source: ' & $sServer @CRLF & 'Destination: ' & $dServer & @CRLF)
    _FileCopy($sServer, $dServer)
    _FileWriteLog($sLogFile, "Copied MSI")
EndFunc

Func _FileCopy($sSource, $sTarget)
    Local $FOF_RESPOND_YES = 16
    $hWinShell = ObjCreate("Shell.Application")
    $hWinShell.namespace($sTarget).CopyHere($sSource, $FOF_RESPOND_YES)
EndFunc

 

Share this post


Link to post
Share on other sites

#11 ·  Posted

@Subz after executing the above script, I got below message back: 

Quote

>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\xulong\Desktop\CopySEMsi.au3"    
C:\Users\xulong\Desktop\CopySEMsi.au3 (19) : ==> Badly formated variable or macro.: 
ConsoleWrite('Source: ' & $sServer @CRLF & 'Destination: ' & $dServer & @CRLF) 
ConsoleWrite('Source: ' & $sServer ^ ERROR
>Exit code: 1    Time: 0.3618

 

Share this post


Link to post
Share on other sites

#12 ·  Posted

Sorry forgot to put & in between $sServer & @CRLF can you try again after you have added it.

Share this post


Link to post
Share on other sites

#13 ·  Posted

Here is the Array (I trimed a bit as the full list is too long)

Quote

Row|Col 0
[0]|77
[1]|\\vm-build\BuildArtifacts\Grand-4.3.2.1327 (Sprint)
[2]|\\vm-build\BuildArtifacts\Grand-4.3.2.1328 (Sprint)
[3]|\\vm-build\BuildArtifacts\Grand-4.3.2.1332 (Sprint)
[4]|\\vm-build\BuildArtifacts\Grand-4.3.2.1341 (Sprint)
........
........
........
[74]|\\vm-build\BuildArtifacts\Grand-4.3.2.1642 (Sprint)
[75]|\\vm-build\BuildArtifacts\Grand-4.3.2.1645 (Sprint)
[76]|\\vm-build\BuildArtifacts\Grand-4.3.2.1646 (Sprint)
[77]|\\vm-build\BuildArtifacts\Grand-4.3.2.1651 (Sprint)

From ConsoleWrite, the results is:

Quote

Source: 77\G4.msi
Destination: \\VM-DEV\c$\Users\Administrator\Desktop

But the file didn't be copied over to Destination.

Share this post


Link to post
Share on other sites

#14 ·  Posted (edited)

So the problem I have at the moment is the script I have post initially is working now (script not hanging after FileCopy) but when integrated with CCNet, the script is running for a few minutes and did not copy the file over (only takes 9 seconds if execute manually)

Edited by Xulong

Share this post


Link to post
Share on other sites

#15 ·  Posted

So $sServer was incorrect so have now updated it, I only used the other _FileCopy function so you could see if it was hanging during the copy.  Here is your original code without the unnecessary code, like WinWait etc..

#include <MsgBoxConstants.au3>
#include <File.au3>
#include <Array.au3>
#include <FileConstants.au3>

CopyFile()

Func copyfile()
    Local $sLogFile = FileOpen(@ScriptDir & "\CopyMSI.log", 1)
    Local $BuildArtifacts = "\\vm-build\BuildArtifacts"
    Local $dServer = "\\VM-DEV\c$\Users\Administrator\Desktop"

    _FileWriteLog($sLogFile, "Opened Builds folder")

    Local $FolderList = _FileListToArrayRec($BuildArtifacts, "Grand-4.*", 2, 0, 1, 2)
    _ArrayDisplay($FolderList)

    Local $sServer = $FolderList[$FolderList[0]] & '\G4.msi'
    ConsoleWrite('Source: ' & $sServer & @CRLF & 'Destination: ' & $dServer & @CRLF)
    FileCopy($sServer, $dServer, $FC_OVERWRITE)
    _FileWriteLog($sLogFile, "Copied MSI")
EndFunc

 

1 person likes this

Share this post


Link to post
Share on other sites

#16 ·  Posted (edited)

Thank you for the script. Now I know the _FileListToArrayRec which is way more tidy and nice to use in this case. I am going to see how to fix the CC.Net issue now.

Edited by Xulong

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Similar Content

    • fopetesl
      By fopetesl
      Struggling to get Filecopy() working
      MsgBox(0,"Moving file: ", $fLine) ; C:\AlmeterS3\AI74_No2.csv FileCopy( $fLine, "C:\AlmeterS3\S3_Database\") ; FileCopy( $fLine, $BatchDir & "\S3_Database\") If @error Then MsgBox($MB_SYSTEMMODAL, "ERROR!", "database write error " & @error) EndIf FileDelete( $fLine) doesn't copy only creates a file "C:\AlmeterS3\S3_Database" (actually AI74_No2.csv)
      Again my typo I should have added
      $FC_OVERWRITE + $FC_CREATEPATH since folder didn't actually exist.
    • Simpel
      By Simpel
      Hi,
      I do recognize bad behaviour at this snippet:
      #include <AutoItConstants.au3> Global $g_sSD = @ScriptDir & "\" Global $g_sBurstPath = $g_sSD & "Burst\" DirCreate($g_sBurstPath) Local $sFileName = "Test_mit_3_Seiten.pdf" ; any PDF with more than 1 page inside @ScriptDir FileCopy($g_sSD & $sFileName, $g_sBurstPath & $sFileName, 1) ;~ Sleep(13000) Local $hTimer = TimerInit() ConsoleWrite("Start" & @CRLF) _Burst($g_sBurstPath & $sFileName) ; bursts PDF into single pages ;~ While _FileInUse($g_sBurstPath & $sFileName) ;~ WEnd ConsoleWrite("End: " & Round(TimerDiff($hTimer)) & "ms" & @CRLF) Exit Func _quotePath($sPath) ; because of possible "spaces" inside pathes $sPath = '"' & $sPath & '"' Return $sPath EndFunc Func _Burst($sFile) Local $sPDFtk = $g_sSD & "pdftk.exe" ; path to pdftk.exe (and libiconv2.dll) Local $sCurrWorkingDir = @WorkingDir FileChangeDir($g_sBurstPath) ; it has to change for reasons Local $iPID = Run(_quotePath($sPDFtk) & ' ' & _quotePath($sFile) & ' burst', "", @SW_SHOW, $STDOUT_CHILD + $STDERR_CHILD) ; @SW_SHOW just to see "PDFtk is working" Local $sOutput, $sError While 1 $sOutput &= StdoutRead($iPID) $sError &= StderrRead($iPID) If @error Then ExitLoop Sleep(10) WEnd FileChangeDir($sCurrWorkingDir) ; back to normal EndFunc Func _FileInUse($sFilename) ; by Siao Local $aRet, $hFile $aRet = DllCall("Kernel32.dll", "hwnd", "CreateFile", _ "str", $sFilename, _ ;lpFileName "dword", 0x80000000, _ ;dwDesiredAccess = GENERIC_READ "dword", 0, _ ;dwShareMode = DO NOT SHARE "dword", 0, _ ;lpSecurityAttributes = NULL "dword", 3, _ ;dwCreationDisposition = OPEN_EXISTING "dword", 128, _ ;dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL "hwnd", 0) ;hTemplateFile = NULL $hFile = $aRet[0] If $hFile = -1 Then ;INVALID_HANDLE_VALUE = -1 $aRet = DllCall("Kernel32.dll", "int", "GetLastError") SetError($aRet[0]) Return 1 ; file in use (@error contains system error code) Else ;close file handle DllCall("Kernel32.dll", "int", "CloseHandle", "hwnd", $hFile) Return 0 ; file not in use EndIf EndFunc This bursting took about 15000ms. If I activate line 8 "Sleep(13000)" then the bursting itself never needed more than 1000ms. Round about 13000ms delay is needed until bursting is acting very fast, otherwise needing about 15000ms.
      Then I tested _FileInUse() instead of _Burst() w/o Sleep(13000). This runs in 3ms. It seemes to me that FileCopy() and Burst() are interacting in a way I can't see.
      Any ideas? Regards, Conrad
      P.S. You need pdftk.exe and libiconv2.dll at @ScriptDir. This you can get free here: https://www.pdflabs.com/tools/pdftk-server/ (I'm not sure whether I'm allowed to attach it here).
       
    • joseLB
      By joseLB
      Suppose you want from time to time to update a destination folder  with new files that where created at a origin folder.
      It´s a kind of synchronization, where new files in origin must be "added" to destination. No worry about files that changed, just the new ones.
      The natural way:   FileCopy  ($originFolder  &  "\*.*"   ,   $destinationFolder  , $FC_NOOVERWRITE)
      After many tests, where I have 300 .jpg files in origin and no subfolders:
      If there is nothing at destination => OK, copy  is done. Now destination has 300 files. If I erase at destination 10 files in the middle (explorer, shift del)  and then filecopy =>  the 10 deleted files are NOT copied !! If I erase at destination 10 files "at the beginning"* (explorer, shift del)  and then filecopy =>  the 10 deleted files are copied !! = OK !! * "at beginning" = sorted by name, ascending, erase the 10 first ones.
      ** I tried $originFolder  &  "\*.*" , $originFolder&"\"  ,  $originFolder , and many other variants. The same for destination.
      So, what´s seems to me is that  when FileCopy finds the first file from origin  that exists at destination it stops to search.  That´s expected behavior?
      Best Regards
      Jose
    • PINTO1927
      By PINTO1927
      Hello guys,
      I'm working on this script:
      Case $BTN Global $URL = FileOpenDialog("IMPORT FILE", $DESKTOP, "ALL FORMAT (*)", 4) $DIR_DEST = "C:\DIR-WORK\list\IMPORT_DOC\" DirCreate($DIR_DEST) Local $LINE For $t = 1 To $URL[0] _FileReadToArray($URL[$t], $LINE) For $u = 1 To $LINE[0] FileCopy($URL[$u], $DIR_DEST) Next Next the selected files via OpenFileDialog must be copied to the folder $DIR_DEST.
       
    • cheeroke
      By cheeroke
      OK, so i run out of ideas how to make this working. Basically my FIleCOpy statement doesn't do it job. I must be missing something. Here is my code:
      #RequireAdmin . . Local $fTasks = "C:\Drivers\Other\Tasks\" Local $fTasksSys = "C:\2\" . . . FileCopy(GUICtrlRead($fTasks) & "Win10_CNC_Setup", $fTasksSys, 8) MsgBox(0, "Boot Setting", "Copied Tasks." & $fTasks & "Win10_CNC_Setup" & @CR & "To " & $fTasksSys) FileDelete($fTasksSys & "ADxLR5_StartUp") MsgBox(0, "Boot Setting", "Deleted tasks.") while it is finally creating folder called "2" it does not want to copy files. Files are .xml but without extension one of the is called: "Win10_CNC_Setup".
      Another thing is I don't understand why this
      $FC_OVERWRITE + $FC_CREATEPATH doesn't work but if i replace it with this
      8 it does create folder.
      Main question is - how to make it copying files?
      Please help.