I am running an automated process on one particular machine, variously a Windows 7 box or a windows Server 2012 box. These boxes are connected to a file server over the network. The network is a 40GB network, so it's not slow. We have to transfer massive volumes of data. Some of these transfers are simply file copies from the file server to the file server. That is, on our AppServer machine, we are (effectively) executing a command such as

\AppServer\C$> copy \FileServer\Share\Dir1* \FileServer\Share2\Dir2

or maybe

\AppServer\C$> robocopy \FileServer\Share\Dir1 \FileServer\Share2\Dir2 /S *

Even on a 40GB network, some of thes copies take significant amounts of time, e.g. 10 minutes, and they may be repeated 20 times.

Doing the same copy on the file server itself is significantly faster as there is no network bottleneck. It is quite possible for us to use remote execution in powershell to have the copy done on the file server. We are currently doing this for some of the larger directories. However, there is significant overhead in just setting up a remote command in powershell, and I am looking for a better method of doing a remote copy.

Does anyone have any recomendations for the best method of executing a remote copy on the file server itself? Thanks.

  1. Enable PowerShell remoting on your servers.
  2. Use Invoke-Command.

I also recommend making sure PowerShell is the same version on all your servers. AFAIK, Server 2012 ships with PowerShell 3.0, and Serve 2012 R2 ships with 4.0. Both 3.0 and 4.0 are available for Win7 and Server 2008, so there's very little reason not to upgrade. The minor improvements in syntax -- notably Get-ChildItem's -Directory and -File, Where-Object being able to pipe out, and not needing to worry about things sometimes being arrays and not being arrays when you want to use the Count() method -- are worth it, IMO. Also, the ISE is pretty good on 4.0.


PsExec is a tool used a lot to execute a command on a remote computer.

PsExec, a tool from Microsoft can be found here.

PsExec is a light-weight telnet-replacement that lets you execute processes on other systems, complete with full interactivity for console applications, without having to manually install client software. PsExec's most powerful uses include launching interactive command-prompts on remote systems and remote-enabling tools like IpConfig that otherwise do not have the ability to show information about remote systems.

PsExec is part of PsTools.

Using PsExec

See the July 2004 issue of Windows IT Pro Magazine for Mark's article that covers advanced usage of PsExec.

Usage: psexec [\\computer[,computer2[,...] | @file]][-u user [-p psswd][-n s]
    [-r servicename][-h][-l][-s|-e][-x][-i [session]][-c [-f|-v]][-w directory]
    [-d][-][-a n,n,...] cmd [arguments]
-a  Separate processors on which the application can run with commas where 1 is 
    the lowest numbered CPU. For example, to run the application on CPU 2 and 
    CPU 4, enter: "-a 2,4"
-c  Copy the specified program to the remote system for execution. If you omit 
    this option the application must be in the system path on the remote system.
-d  Don't wait for process to terminate (non-interactive).
-e  Does not load the specified account’s profile.
-f  Copy the specified program even if the file already exists on the remote 
-i  Run the program so that it interacts with the desktop of the specified 
    session on the remote system. If no session is specified the process runs in
    the console session.
-h  If the target system is Vista or higher, has the process run with the 
    account's elevated token, if available.
-l  Run process as limited user (strips the Administrators group and allows only
    privileges assigned to the Users group). On Windows Vista the process 
    runs with Low Integrity.
-n  Specifies timeout in seconds connecting to remote computers.
-p  Specifies optional password for user name. If you omit this you will be 
    prompted to enter a hidden password.
-r  Specifies the name of the remote service to create or interact with.
-s  Run the remote process in the System account.
-u  Specifies optional user name for login to remote computer.
-v  Copy the specified file only if it has a higher version number or is newer
    on than the one on the remote system.
-w  Set the working directory of the process (relative to remote computer).
-x  Display the UI on the Winlogon secure desktop (local system only).
-priority   Specifies -low, -belownormal, -abovenormal, -high or -realtime to 
    run the process at a different priority. Use -background to run at low 
    memory and I/O priority on Vista.
computer    Direct PsExec to run the application on the remote computer or 
    computers specified. If you omit the computer name, PsExec runs the
    application  on the local system, and if you specify a wildcard (\\*), 
    PsExec runs the command on all computers in the current domain.
@file   PsExec will execute the command on each of the computers listed in the 
cmd Name of application to execute.
arguments   Arguments to pass (note that file paths must be absolute paths on 
    the target system).
-accepteula This flag suppresses the display of the license dialog.

You can enclose applications that have spaces in their name with quotation marks e.g.

psexec \marklap"c:\long name app.exe"

  • Thanks. I tried PsExec in the past for remote execution in another context and found I could not do what I wanted, though I can't remember the exact reason right now. (Don't get me wrong, I'm a big fan of all sysinternal's tools). I will revisit it perhaps. – David I. McIntosh Nov 12 '14 at 22:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.