我创建了以下简单的批处理文件....我在这里要完成的是使用远程命令(RCMD实用程序)连接到(clusters.txt)中定义的列表o服务器并删除列表视频文件在(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
任何帮助都会非常感激。
答案 0 :(得分:0)
这样的事情应该会有所帮助。
我现在不知道文件名后面有*
但是必须删除它
剧本。或者是.*
???
编辑:如果您有各种具有相同名称和各种(“未知”)扩展名的文件,那么您必须使用新的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!.*))
答案 1 :(得分:0)
@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
或{ {1}})
delasset.bat应该包含
c:\windows\system32
(同样,我只是@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的特殊字符(它意思是“在&
之前完成事情,然后事情之后的事情”,&
需要被一个插入符号“&
”“转义”,其中说“这是一个特殊字符,我想用作普通人物“。
将^
牢固地放在适当位置可以让您准确了解应该交付的内容。可悲的是,我不知道这是否正确......
答案 2 :(得分:0)
在不知道操作系统的服务器和客户端版本的情况下,可能会出现某种命令行限制。但是,让我们试试
@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