Назад | Перейти на главную страницу

Мне нужно очистить один и тот же каталог на нескольких серверах в сети. Как мне это сделать?

На нескольких (около 20) серверов существует один и тот же каталог C: \ Deployments. В этом каталоге есть несколько вложенных папок, которые содержат больше вложенных папок и файлов. Сам каталог C: \ Deployments не содержит файлов.

У меня есть командный файл, который при локальном запуске очищает каталог C: \ Deployments. То есть он удаляет все подпапки и их файлы, но не удаляет сам каталог C: \ Deployements.

Код командного файла:

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

У меня такой вопрос:

Как запустить этот командный файл на каждом сервере из локализованного окна? То есть, как мне запустить один командный файл и заставить эти команды выполняться на всех серверах одновременно?

Спасибо за любую помощь / идеи!

У меня больше нет машины с Windows, но я делал это на работе. Существует psexec, который позволяет удаленно подключаться к другому серверу. Вы также можете изучить удаленное взаимодействие с PowerShell.

Powershell Remoting см. http://msdn.microsoft.com/en-us/library/windows/desktop/ee706585(v=vs.85).aspx

Используя Dos / Batch, см. http://ss64.com/nt/psexec.html

Если вы хотите, чтобы они запускались одновременно, вы можете сделать это, запустив задания в PowerShell, см. Тот же сайт ss64.

Если ты заинтересован...

Если ваши серверы перечислены в активном каталоге, вы можете проделать небольшой трюк, говоря, что циклически перебирают компьютеры с помощью Active Directory.

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

или замените dsquery ... на gc $ your_file_name, содержащий список файлов. Dos / Batch - мой синтаксис может быть отключен, но это хороший способ перебрать компьютеры

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!
)

или замените dsquery ... на тип "% your file name%"

Кроме того, если вы когда-нибудь столкнетесь с проблемой установки переменных в цикле в пакете, где они не сохраняются, как вы ожидали, поместите setlocal enabledelayedexpansion в верхнюю часть своей программы и оцените свои переменные, как это ! var_name! вместо% var_name%

Откровенно говоря, ответ Кикучиё потрясающий, и я проголосовал за него. Однако для полноты картины я предлагаю вам подключиться к каждому серверу и удалить файлы через удаленный общий ресурс.

Я предполагаю здесь администратора домена или, по крайней мере, учетную запись, у которой есть администратор на каждой из машин.

Но в основном я бы сделал что-то вроде этого (сохраняя ваш код для выполнения работы, а не так, как я это делал perosnally, но это не значит, что я прав)

server.txt - это просто список имени хоста / IP-адреса сервера

для / f %% a в (servers.txt) do: process %% a

:обработать

установить СЕРВЕР =% 1

ЕСЛИ [% SERVER%] == [] GOTO EOF

ЧИСТЫЙ ИСПОЛЬЗОВАНИЕ T: \% SERVER% \ C $ \ Deployments

установить CAT = T:

каталог "%% CAT %%" / s / b / a | sort / r >>% TEMP% \ files2del.txt

для / f "delims =;" %% D в (% TEMP% \ files2del.txt) do (del / q "%% D" & rd "%% D")

del / q% TEMP% \ files2del.txt

: EOF

Я хотел бы предложить комбинацию WinRM / WinRS (Windows Remote Management / Windows Remote Shell), которая требует предварительной настройки, но использует инструменты, уже встроенные в Windows.

После завершения настройки ваш скрипт необходимо будет изменить, чтобы включить команду winrs для подключения. Вы можете создать список серверов в другом текстовом файле и обернуть еще один цикл FOR вокруг вашего текущего скрипта, чтобы избежать 20 строк, которые все делают одно и то же.