Windows Command Prompt.我想在单行命令中执行以下操作。我想用一个简单的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
我不能为此 taks 使用临时文件,我试过这个:
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时。有人知道如何解决这个问题吗?
编辑在一个稍微简化的命令中使用调用回显而不是 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
^
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
您可以作为单行执行
此批处理用户密码路径 1 路径 2 路径 3...
(是的 - pscp
只是被回声进行验证......
或者,对于多合一行的版本,为了清楚起见,我将将其分布在几个版本上(并且因为我是在"DOS"会话中编写的(:
@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
*
和 ?
不能用作合法的文件名字符,将它们包含在字符串中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 . . .