我创建了以下简单的批处理文件..。我在这里试图完成的是使用远程命令(RCMD实用程序)连接到定义在(clusters.txt)中的服务器列表,并删除(assets.txt)中定义的视频文件列表。我想删除每台服务器上的那些资产。但是,这个批处理文件可以工作,但是它必须连接和断开连接才能删除每一块资产,这正是我想要避免的。我希望能够连接到1台服务器,并使用scp del cmd删除我的资产列表%%B,然后从该服务器断开连接,转到列表%A上的下一个服务器,并仅使用一个连接删除所有资产,而不必连接和断开200次。
@echo off
FOR /F "tokens=*" %%A IN (clusters.txt) DO FOR /F "tokens=*" %%B in (assets.txt) DO rcmd \\%%A \vstrmkit\scp del %%B这就是文件列表的样子:
11E8A51A*
11E8A51D*
11E8A614*
11E88E4E*
11E88E4C*服务器的列表--它只是带有字母和数字的计算机主机名:
SEA88630-N0任何帮助都是非常感激的。
发布于 2013-12-27 15:25:38
在不了解操作系统的服务器和客户端版本的情况下,可能会有某种命令行限制。但是,让我们试试
@echo off
rem prepare environment
setlocal enableextensions enabledelayedexpansion
rem Define the command that will be executed for each element
set "command=echo \vstrmkit\scp del"
rem Prepare the command for the list of files into a environment variable
set "command=set c=%command% "
for /f "tokens=*" %%f in (assets.txt) do set "command=!command!/@c@%%~f"
rem Adjust the command variable to generate a valid concatenation of commands
set "command=%command:/=&%"
rem Connect to each of the servers sending the generated command
rem In the last step, change the @ with ! to generate on remote, when
rem delayed expansion is applied, the correct final command to execute
setlocal disabledelayedexpansion
for /f "tokens=*" %%a in (clusters.txt) do rcmd \\%%a cmd.exe /v:on /c "%command:@=!%"请注意,主命令在其中定义的行中,有一个插入的echo进行测试。如果一切看起来都还好,请删除echo来完成它的工作。
编辑-选项2
似乎引号有问题。前面的代码在我的系统中工作,但在OP中不起作用。我们再试一次。它也适用于我的系统。
@echo off
rem prepare environment
setlocal enableextensions disabledelayedexpansion
rem Define the command that will be executed for each element
set "command=echo \vstrmkit\scp del"
rem Define a temporary file to contain commands to process
set "tempFile=%temp%\%~nx0.tmp"
rem Generate the content of the temp file with the list of commands
rem to execute for each server
(
for /f "tokens=*" %%f in (assets.txt) do echo %command% %%f
echo exit
) > "%tempFile%"
rem Connect to each of the servers sending the generated command list
for /f "tokens=*" %%a in (clusters.txt) do (
rcmd \\%%a < "%tempFile%"
)
del /f /q "%tempFile%" > nul 2>nul
endlocal发布于 2013-12-27 00:50:54
像这样的东西会有帮助的。我现在不支持您在文件名之后有一个*,但是它必须被脚本删除。或者是.*?
编辑:如果您有同名的各种文件和各种(“未知”)扩展名,那么您必须使用一个新的FOR循环来测试这些扩展:
@echo off
setlocal EnableDelayedExpansion
FOR /F "tokens=*" %%A IN ('type clusters.txt') DO (
FOR /F "tokens=*" %%B in ('type assets.txt') DO (
set $asset=%%B
rcmd.exe \\%%A \vstrmkit\scp del !$asset:~0,-1!.*))发布于 2013-12-27 01:13:12
@ECHO OFF
SETLOCAL
SET "filelist="
FOR /f "delims=" %%A IN (assets.txt) DO CALL SET filelist=%%filelist%% %%A
FOR /F "tokens=*" %%A IN (clusters.txt) DO echo rcmd \\%%A \vstrmkit\scp del %filelist%
GOTO :EOF所需的命令只是用于测试目的的ECHO编辑。验证命令正确后,将ECHO rcmd更改为rcmd以执行删除
如果命令不能接受多个参数,可能的解决方案如下:
创建一个名为delasset.bat的批处理文件,并将其复制到每台目标计算机上的\vstrmkit或每台机器的path上的其他目录(如c:\windows或c:\windows\system32)中。
delasset.bat应该包含
@ECHO OFF
ECHO DEL %*(同样,我只是简单地ECHO编辑了DEL --您需要在验证之后删除echo才能激活)
然后将...rcmd \\%%A \vstrmkit\scp del %filelist%更改为...rcmd \\%%A \vstrmkit\scp DELASSET %filelist%
(这是不区分大小写的,我已经把它作为重点看出来了)
另一种可能的方式是:
@ECHO OFF
SETLOCAL
SET "filelist="
FOR /f "delims=" %%A IN (assets.txt) DO CALL SET filelist=%%filelist%%:%%A
SET filelist=%filelist:~1%
FOR /F "tokens=*" %%A IN (clusters.txt) DO echo rcmd \\%%A \vstrmkit\scp del %filelist::=^&\vstrmkit\scp del %
GOTO :EOF哪个应该产生(例如)
rcmd \\SEA88630-N0 \vstrmkit\scp del 11E8A51A*&\vstrmkit\scp del 11E8A51D*&\vstrmkit\scp del 11E8A614*&\vstrmkit\scp del 11E88E4E*&\vstrmkit\scp del 11E88E4C*请注意,现在构建filelist时使用了分隔项的冒号。冒号不能是文件名的一部分。第一个字符(将是冒号,因为filelist已附加了:filenamefromfile )随后被去掉(参见set/?从提示子字符串文档)。
%filelist::=^&\vstrmkit\scp del %中的象形文字意味着‘与丝状,代替(第一个:)之间的字符之间的第一个:和= -恰巧是一个冒号与字符串&\vstrmkit\scp del (即。=和结束%之间的所有字符--加上额外的修改,因为&是cmd的一个特殊字符(意思是‘在&之前做事情,那么后面的东西’),&需要用插入符号(^)“转义”,其中写着“这是我想要用作普通字符的一个特殊字符”。
将echo牢牢地保留在适当的位置将使您能够准确地看到应该交付的内容。可悲的是,我不知道这是否正确.
https://stackoverflow.com/questions/20791840
复制相似问题