在多台(约 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
我的问题是:
如何从本地窗口在每台服务器上运行此批处理文件?也就是说,如何运行一个批处理文件并让这些命令同时在每台服务器上执行?
谢谢您的帮助/想法!
答案1
我不再有 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 站点。
如果你感兴趣...
如果你的服务器在活动目录中列出,你可以使用活动目录循环遍历计算机
dsquery computer -limit 0 | ?{$_ -imatch "CN=([^,]+),"} | % {
#remotely run your script here through ps remote
}
或者用包含文件列表的 gc $your_file_name 替换 dsquery...。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... 替换为类型“%您的文件名%”
此外,如果您在批处理循环中设置变量时遇到问题,而这些变量不能像您预期的那样持久化,请将 setlocal enabledelayedexpansion 放在程序顶部,然后像这样评估变量!变量名称!而不是 %var_name%
答案2
我建议使用 WinRM/WinRS(Windows 远程管理/Windows 远程 Shell)组合,它需要事先进行一些设置,但使用 Windows 中已内置的工具。
完成设置后,您的脚本将需要更改以包含用于连接的 winrs 命令。您可以在另一个文本文件中创建服务器列表,并在当前脚本周围再包装一个 FOR 循环,以避免 20 行代码都执行相同的操作。
答案3
坦白说,kikuchiyo 的回答很棒,我也投了赞成票。但为了完整性,我建议您可以映射到每台服务器并通过远程共享删除文件。
我假设这里有一个域管理员,或者至少是一个在每台机器上都有管理员权限的帐户。
但基本上我会做这样的事情(保留你的代码来完成工作,而不是我个人所做的,但这并不意味着我是对的)
servers.txt 只是服务器主机名/IP 地址的列表
对于(servers.txt)中的/f %%a,执行:处理%%a
:过程
设置服务器=%1
如果 [%服务器%]==[] 转到 EOF
NET USE T:\%SERVER%\C$\Deployments
设置CAT = T:
目录 "%%CAT%%"/s/b/a | sort /r >> %TEMP%\files2del.txt
对于/f“delims=;”%%D 在(%TEMP%\files2del.txt)中执行(del/q“%%D”&rd“%%D”)
del /q %TEMP%\files2del.txt
:EOF