首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于命令帮助-嵌套命令

用于命令帮助-嵌套命令
EN

Stack Overflow用户
提问于 2013-12-26 22:00:59
回答 3查看 146关注 0票数 0

我创建了以下简单的批处理文件..。我在这里试图完成的是使用远程命令(RCMD实用程序)连接到定义在(clusters.txt)中的服务器列表,并删除(assets.txt)中定义的视频文件列表。我想删除每台服务器上的那些资产。但是,这个批处理文件可以工作,但是它必须连接和断开连接才能删除每一块资产,这正是我想要避免的。我希望能够连接到1台服务器,并使用scp del cmd删除我的资产列表%%B,然后从该服务器断开连接,转到列表%A上的下一个服务器,并仅使用一个连接删除所有资产,而不必连接和断开200次。

代码语言:javascript
复制
@echo off

FOR /F "tokens=*" %%A IN (clusters.txt) DO FOR /F "tokens=*" %%B in (assets.txt) DO rcmd \\%%A \vstrmkit\scp del %%B

这就是文件列表的样子:

代码语言:javascript
复制
11E8A51A*
11E8A51D*
11E8A614*
11E88E4E*
11E88E4C*

服务器的列表--它只是带有字母和数字的计算机主机名:

代码语言:javascript
复制
SEA88630-N0

任何帮助都是非常感激的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-27 15:25:38

在不了解操作系统的服务器和客户端版本的情况下,可能会有某种命令行限制。但是,让我们试试

代码语言:javascript
复制
@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中不起作用。我们再试一次。它也适用于我的系统。

代码语言:javascript
复制
@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
票数 0
EN

Stack Overflow用户

发布于 2013-12-27 00:50:54

像这样的东西会有帮助的。我现在不支持您在文件名之后有一个*,但是它必须被脚本删除。或者是.*

编辑:如果您有同名的各种文件和各种(“未知”)扩展名,那么您必须使用一个新的FOR循环来测试这些扩展:

代码语言:javascript
复制
@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!.*))
票数 0
EN

Stack Overflow用户

发布于 2013-12-27 01:13:12

代码语言:javascript
复制
@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:\windowsc:\windows\system32)中。

delasset.bat应该包含

代码语言:javascript
复制
@ECHO OFF
ECHO DEL %*

(同样,我只是简单地ECHO编辑了DEL --您需要在验证之后删除echo才能激活)

然后将...rcmd \\%%A \vstrmkit\scp del %filelist%更改为...rcmd \\%%A \vstrmkit\scp DELASSET %filelist%

(这是不区分大小写的,我已经把它作为重点看出来了)

另一种可能的方式是:

代码语言:javascript
复制
@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

哪个应该产生(例如)

代码语言:javascript
复制
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牢牢地保留在适当的位置将使您能够准确地看到应该交付的内容。可悲的是,我不知道这是否正确.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20791840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档