对于Command帮助 - 嵌套命令

时间:2013-12-26 22:00:59

标签: batch-file for-loop command-prompt

我创建了以下简单的批处理文件....我在这里要完成的是使用远程命令(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

任何帮助都会非常感激。

3 个答案:

答案 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