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