简单的xmlstarlet示例来复制文件

时间:2015-02-09 19:58:57

标签: terminal command-prompt xmlstarlet

Windows命令提示符。我想在ONE-LINER COMMAND中执行以下操作。 我想用一个简单的xml结构设置一个变量:

<pathlist>
<path>C:\file.txt</path>
<path>C:\file2.txt</path>
</pathlist>
像这样:

SET "_myvar=^<pathlist^>^<path^>C:\file.txt^</path^> ^<path^>C:\file2.txt^</path^>^</pathlist^>"

然后我想回应这个并将其传递给xmlstarlet:

echo !_myvar!|xmlstarlet sel -t  -v  "//path"

然后应该将结果放入另一个var源文件中,使用for循环?

 for /f %i in ('call echo %^_myVar%^|xmlstarlet sel -t  -v  "/*" ') do set sourcefiles=%i

最后pscp源文件到远程Unix

pscp -l user-pw password %sourcefiles% openstack@remoteIP:/opt/testfolder

我无法使用临时文件进行此操作,我试过这个:

SET "_myVar=^<pathlist^>^<path^>C:\file1.txt^</path^> ^<path^>C:\file2.txt^</path^>^</pat
hlist^>"& for /f %i in ('cmd /v:on /c echo !_myVar!|xmlstarlet sel -t  -v  "/*" ') do set sourcefiles=%i &&cmd /v:on /
c pscp -l user -pw password %sourcefiles% openstack@remoteIp:/opt/testfolder

并收到此错误:

| was unexpected at this time.

问题是当我想将var内容回应到xmlstarlet时,我想。有谁知道如何解决这个问题?

修改 在稍微简化的命令中使用call echo而不是cmd / v:on我收到此错误:

SET "_myVar=^<pathlist^>^<path^>C:\file1.txt^</path^> ^<path^>C:\file2.txt^</path^>^</pat
    hlist^>"& 'call echo ^^%^_myVar!%^^|xmlstarlet sel -t  -v  "/*" 

错误:

-:1.1: Document is empty

^
-:1.1: Start tag expected, '<' not found

^

1 个答案:

答案 0 :(得分:0)

SET "_myVar=^<pathlist^>^<path^>C:\file1.txt^</path^> ^<path^>C:\file2.txt^</path^>^</pathlist^>"& for /f %i in ('cmd /v:on /c echo !_myVar!^|xmlstarlet sel -t  -v  "/*" ') do set sourcefiles=%i &&cmd /v:on /c pscp -l user -pw password %sourcefiles% openstack@remoteIp:/opt/testfolder

应修正| was unexpected at this time.错误。唯一的变化是使用^转义管道,它告诉cmd管道是命令的一部分,而不是cmd的指令。


我的重点是有关管道的错误报告。

我发现echo并不排<作为字符串的第一个字符echo - 所以我玩了一会儿。

然后我割草并清理了院子。

然后我想 - 好吧,sed怎么样?我使用GNUSED,因为你输出到* Nix系统,SED的世界不应该太可怕。

如何 - 作为批处理文件,

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "uname=%~1"&shift
SET "pass=%~1"&shift
SET "sourcefiles="
SET "_myVar=*pathlist?"
:dirloop
IF "%~1" neq "" SET "_myvar=%_myvar% *path?%~1*/path?"&shift&GOTO dirloop
SET "_myvar=%_myvar%*/pathlist?"
for /f %%i in ('echo %_myvar%^|sed s/\x2a/\x3c/g^;s/\x3f/\x3e/g^|xmlstarlet sel -t  -v  "/*" ') do ECHO %%i&set "sourcefiles=!sourcefiles! %%i"
ECHO pscp -l %uname% -pw %pass% %sourcefiles% openstack@remoteIp:/opt/testfolder

您可以将其作为单行执行

thisbatch 用户密码path1 path2 path3 ...

(是的 - pscp正在回应验证......)

或者,对于一体化版本,为了清晰起见,我将其分散在几个版本中(因为我在&#34; DOS&#34;会话中写了它) :

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "_myvar=*pathlist?*path?C:\file.txt*/path? *path?C:\file2.txt*/path?*/pathlist?"
SET "sourcefiles="
for /f %%i in ('echo %_myvar%^|sed s/\x2a/\x3c/g^;s/\x3f/\x3e/g^|xmlstarlet sel -t  -v  "/*" ') do set "sourcefiles=!sourcefiles! %%i"
ECHO pscp -l user -pw password !sourcefiles! openstack@remoteIp:/opt/testfolder

SInce *?无法用作合法的文件名字符,包括它们在字符串set中进入环境,然后使用echo发送*?到sed将其转换为<>以输入xmlstarlet - 现在可能有用(但我没有xmlstarlet进行测试 - 我得出结论只是输出各种各样的清单...)

请注意^转义;命令中的sed


这是可能有效的一体化版本

SETLOCAL ENABLEDELAYEDEXPANSION&SET "_myvar=*pathlist?*path?C:\file.txt*/path? *path?C:\file2.txt*/path?*/pathlist?"&SET "sourcefiles="&(for /f %%i in ('echo %_myvar%^|sed s/\x2a/\x3c/g^;s/\x3f/\x3e/g^|xmlstarlet sel -t  -v  "/*" ') do set "sourcefiles=!sourcefiles! %%i")&pscp -l user -pw password !sourcefiles! openstack@remoteIp:/opt/testfolder

但我无法在您的环境中对此进行测试。


这是我使用的行:

SETLOCAL ENABLEDELAYEDEXPANSION&SET "_myvar=*pathlist?*path?C:\file.txt*/path? *path?C:\file2.txt*/path?*/pathlist?"&SET "sourcefiles="&(for /f %%i in ('echo %_myvar%^|sed s/\x2a/\x3c/g^;s/\x3f/\x3e/g^|xmlstarlet sel -t  -v  "/*" ') do set "sourcefiles=!sourcefiles! %%i")&pscp -l user -pw password !sourcefiles! openstack@remoteIp:/opt/testfolder

我使用了名为 xmlstarlet.bat

的批处理文件
@ECHO OFF
SETLOCAL
ECHO phial1.txt
ECHO phial2.txt
ECHO phial3.txt
ECHO phial4.txt
ECHO phial5.txt

运行时应该只生成5行输出

我使用了名为 pscp.bat

的批处理文件
@ECHO OFF
SETLOCAL
ECHO running PSCP
ECHO %*
PAUSE

结果是:

running PSCP
-l user -pw password  phial1.txt phial2.txt phial3.txt phial4.txt phial5.txt openstack@remoteIp:/opt/testfolder
Press any key to continue . . .