На нескольких (около 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 строк, которые все делают одно и то же.