Link to home
Start Free TrialLog in
Avatar of dedri
dedriFlag for United States of America

asked on

execute cmd script on multiple computers

I have a script script.cmd which I want to execute on half of the computers in our organization.
Could you tell me how to do it?
Most of workstations are XP SP3, and a couple win7
Avatar of Steven Harris
Steven Harris
Flag of United States of America image

Try using a PowerShell .ps1 file with this script from Mohamed Garrana:

# ============================================================================================== 
#   
# Script Name : Run Remote cmd.exe Commands 
#  
# AUTHOR: Mohamed Garrana  
# DATE  : 4/12/2010 
#  
# COMMENT:  
# this script invokes whatever command you can use in cmd.exe on one or more computers 
#you input the command name as a screen input when you run the script 
#you can use all cmd.exe command like [del,ipconfig /flushdns,ipconfig /registerdns,gpupdate /force ,notepad.exe,defrag c:, ... 
#..wuauclt /detectnow,powercfg,net start ,net stop,copy,arp,wscript.exe ....] 
#if you can do it from cmd.exe you can do it here on multiple computers at the same time 
# ============================================================================================== 
 
 
function Run-RemoteCMD { 
 
    param( 
    [Parameter(Mandatory=$true,valuefrompipeline=$true)] 
    [string]$compname) 
    begin { 
        $command = Read-Host " Enter command to run" 
        [string]$cmd = "CMD.EXE /C " +$command 
                        } 
    process { 
        $newproc = Invoke-WmiMethod -class Win32_process -name Create -ArgumentList ($cmd) -ComputerName $compname 
        if ($newproc.ReturnValue -eq 0 ) 
                { Write-Output " Command $($command) invoked Sucessfully on $($compname)" } 
                # if command is sucessfully invoked it doesn't mean that it did what its supposed to do 
                #it means that the command only sucessfully ran on the cmd.exe of the server 
                #syntax errors can occur due to user input  
     
     
     
     
    } 
    End{Write-Output "Script ...END"} 
                 } 
     
 
#---------------- 
#you can use this script to run any command that can be run on CMD.EXE 
#the following is only to give you an idea how can you use it 
#----------------- 
#for copying files from many remote computers to a single 
# get-content c:\servers.txt | Run-Remotecommand 
#Enter command to run: copy c:\log\log.txt d:\ 
#you only input "copy c:\log\log.txt d:\" 
#--------------------------------------- 
#for forcing group policy update on multiple computers 
# get-content c:\servers.txt | Run-Remotecommand 
#Enter command to run: gpupdate /force 
#-------------------------------------- 
#for stopping the Bits service on multiple computers 
# get-content c:\servers.txt | Run-Remotecommand 
#Enter command to run: Net stop bits 
#--------- 
#you can always run it against a single server using  
#Run-RemoteCommand server1 
#Enter command to run: enter whatever you'd normally enter in cmd.exe shell 
 
 
 

Open in new window

If you want to stay away from PowerShell, you can use PsExec from the Sysinternals toolkit:

Make a list of servers/machines - Servers.txt  and then run -

psexec @Servers.txt -c Script.cmd

This will copy over the script and then execute on each machine.
Avatar of McKnife
3rd possible way: simply wrap that script into an msi using any msi wrapper like exetomsi or wiww. That way, you don't even need to power on those machines, they will do "install" that setting whenever they power on and decide to accept that policy.
Avatar of dedri

ASKER

ThinkSpaceSolutions, could you explain how to work with first script.
I found a script in this link which uses psexec, but I have a problem running it.
http://community.spiceworks.com/scripts/show/446-remote-execution-on-multiple-computers

If I run it manually here is the result
C:\temp\ExecMC>psexec \\computer1 -c \\server\share\scripts\Unreg.cmd

Here is the content of the cmd file
########

@Echo off

Echo *
Echo * SIGNME AS COM SERVER
Echo *

signme.exe /unregserver

Echo *
Echo * REGISTER ASSEMBLY
Echo *

%WINDIR%\Microsoft.NET\Framework\v1.1.4322\regasm /unregister signme.base.dll /tlb /v

rem fin:

##########

------------Here is the result from execution of the command---------

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com


*
'signme.exe' is not recognized as an internal or external command,
operable program or batch file.
* SIGNME AS COM SERVER
*
*
* REGISTER ASSEMBLY
*
Microsoft (R) .NET Framework Assembly Registration Utility 1.1.4322.573
Copyright (C) Microsoft Corporation 1998-2002.  All rights reserved.

RegAsm error: Unable to locate input assembly: 'signme.base.dll'
Unreg.cmd exited on computer1 with error code 0.

--------------------------------

If I psexec the computer, browse the script on local folder and run it , it's executed successful.
Any idea how to fix it?
This is how I use it:

First, you should navigate to the location of the folder that file is located on your local machine.  For example, my scripts are stored on my file server 'TSShare' (mapped as T:\) under the Scripts folder.

T:\Scripts>

Then I call my list of servers, add -c to copy to the servers, then the script:

T:\Scripts> @T:\Servers\ServerSet1.txt -c Script1.bat

Is this the same format you are using?
Avatar of dedri

ASKER

sorry, I didn't understand your answer.

What I am doing is the following:
psexec \\computer1 -c \\server\share\scripts\Unreg.cmd
or
psexec \\computer1 Unreg.cmd
or anything similar

And the output is

------------Here is the result from execution of the command---------

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com


*
'signme.exe' is not recognized as an internal or external command,
operable program or batch file.
* SIGNME AS COM SERVER
*
*
* REGISTER ASSEMBLY
*
Microsoft (R) .NET Framework Assembly Registration Utility 1.1.4322.573
Copyright (C) Microsoft Corporation 1998-2002.  All rights reserved.

RegAsm error: Unable to locate input assembly: 'signme.base.dll'
Unreg.cmd exited on computer1 with error code 0.

--------------------------------

If I do this:

psexec \\computer1 cmd
and on the prompt I run Unreg.cmd it is executed successful.

Anything different on both cases and idea how to make it working.
Try creating a copy of your .cmd and changing the association to .bat.
Avatar of dedri

ASKER

I tried changing the script file from .cmd to .bat , but the problem still exist, the same error message as above.
Why not use a wrapper like I recommended? As I described: it holds even more advantaged compared to psexec.
Avatar of dedri

ASKER

McKnife, could you explain in more details your solution.
I cannot understand what to do when I  create a msi package for this script.
ASKER CERTIFIED SOLUTION
Avatar of McKnife
McKnife
Flag of Germany image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of dedri

ASKER

sorry for late response. I haven't got any time recently. I'll try your solution and give you reply.
Please respond or finalize it, this question is growing old :)
Avatar of dedri

ASKER

sorry, I didn't have time to test your solution. I was appointed to another project