Preciso limpar o mesmo diretório em vários servidores em uma rede. Como eu faço isso?

2

Em vários servidores (cerca de 20), existe o mesmo diretório C: \ Deployments. Esse diretório tem várias subpastas que contêm mais subpastas e arquivos. O diretório C: \ Deployments em si não contém arquivos.

Eu tenho um arquivo em lotes que, quando executado localmente, limpa o diretório C: \ Deployments. Ou seja, exclui todas as subpastas e seus arquivos, mas não exclui o próprio diretório C: \ Deployements.

O código do arquivo em lote é:

echo off

set CAT=c:\deployments

dir "%%CAT%%"/s/b/a | sort /r >> %TEMP%\files2del.txt 
for /f "delims=;" %%D in (%TEMP%\files2del.txt) do (del /q "%%D" & rd "%%D") 
del /q %TEMP%\files2del.txt

Minha pergunta é esta:

Como executo esse arquivo em lote em cada servidor a partir de uma janela localizada? Ou seja, como executo um arquivo em lote e executo esses comandos em todos os servidores simultaneamente?

Obrigado por qualquer ajuda / ideias!

    
por blashmet 10.11.2011 / 19:37

3 respostas

3

Eu não tenho mais uma máquina Windows, mas costumava fazer essas coisas no trabalho. Há psexec que permite que você remova para outro servidor. Você também pode procurar no remoting do powershell.

Powershell Remoting consulte link

Usando o Dos / Batch, consulte o link

Se você quiser que eles sejam executados simultaneamente, você pode fazer isso, executando tarefas no powershell, veja o mesmo site ss64.

Se você estiver interessado ...

Se seus servidores estão listados no diretório ativo, você pode fazer um pequeno truque onde você diz loop através de computadores usando o Active Directory

dsquery computer -limit 0 | ?{$_ -imatch "CN=([^,]+),"} | % {
  #remotely run your script here through ps remote
}

ou substitua dsquery ... por gc $ your_file_name contendo a lista de arquivos. Dos / Batch - minha sintaxe pode estar desativada, mas esta é uma ótima maneira de fazer um loop pelos computadores

for /f "eol=, tokens=1, delims=" %cc in ('dsquery computer -name -limit 0 ^| find /i /r /c:'"CN=([^,]+),"') do (

  @REM cannot recall how i used to get back references in dos like this, so may be off.
  @REM call your script here, passing your batch program to psexec
  set computer=%%c
  echo computer=!computer!
)

ou substitua dsquery ... pelo tipo "% seu nome de arquivo%"

Além disso, se alguma vez você encontrar um problema definindo variáveis dentro de um loop em lote onde elas não persistem como seria de esperar, coloque setlocal enabledelayedexpansion no topo de seu programa e avalie suas variáveis como este ! var_name ! em vez de% var_name%

    
por 10.11.2011 / 20:19
0

Gostaria de sugerir a combinação WinRM / WinRS (Gerenciamento Remoto do Windows / Shell Remoto do Windows), que requer um pouco de configuração antecipadamente, mas usa ferramentas já incorporadas ao Windows.

Quando a configuração estiver concluída, o script precisará ser alterado para incluir o comando winrs para se conectar. Você poderia criar uma lista de servidores em outro arquivo de texto e envolver outro loop FOR em torno do seu script atual para evitar ter 20 linhas que fazem a mesma coisa.

    
por 10.11.2011 / 21:01
0

A resposta de Frankly kikuchiyo é incrível e eu votei muito. No entanto, por questões de integridade, sugiro que você possa mapear para cada servidor e excluir os arquivos por meio de um compartilhamento remoto.

Estou assumindo um administrador de domínio aqui, ou pelo menos uma conta que tenha admin em cada uma das máquinas.

Mas, basicamente, eu faria algo assim (mantendo seu código para fazer o trabalho, não como eu teria feito isso perosnalmente, mas isso não significa que eu esteja certo)

servers.txt é apenas uma lista do nome de host / endereço IP do servidor

for /f %%a in (servers.txt) do :process %%a

:process

set SERVER=%1

IF [%SERVER%]==[] GOTO EOF

NET USE T: \%SERVER%\C$\Deployments

set CAT=T:

dir "%%CAT%%"/s/b/a | sort /r >> %TEMP%\files2del.txt

for /f "delims=;" %%D in (%TEMP%\files2del.txt) do (del /q "%%D" & rd "%%D")

del /q %TEMP%\files2del.txt

:EOF

    
por 18.01.2012 / 18:46