2015-02-09 3 views
0

Windows Command Prompt. Я хочу сделать следующее в команде ONE-LINER. я хочу, чтобы установить переменную с простой структурой XML:простой пример xmlstarlet для копирования файлов

<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 SourceFile к удаленному Unix

pscp -l user-pw password %sourcefiles% [email protected]:/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% [email protected]:/opt/testfolder 

и получите эту ошибку:

| was unexpected at this time. 

проблема в том, когда я хочу Я думаю, эхо значение var для xmlstarlet. Кто-нибудь знает, как это решить?

Редактировать с помощью вызова эхо вместо ЦМД/v: на в slighty упрощенным команды я получаю эту ошибку:

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
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% [email protected]:/opt/testfolder 

должны исправить свои | was unexpected at this time. ошибка. Единственное изменение заключается в том, чтобы выйти из трубы с ^, который сообщает cmd, что этот канал является частью команды, а не инструкцией cmd.


В центре внимания был отчет об ошибке о трубе.

Я обнаружил, что echo не является строкой < как первый символ строки echo ed - так что я немного поиграл с ней.

А потом я разрезал траву и немного почистил двор.

А потом я подумал - ну, как насчет 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% [email protected]:/opt/testfolder 

Что вы могли бы выполнить в виде одной строки

thisbatch пароль пользователя path1 path2 path3 ...

(Да уж - 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! [email protected]:/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! [email protected]:/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! [email protected]:/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 [email protected]:/opt/testfolder 
Press any key to continue . . . 
+0

спасибо !, как бы код работы с CALL-ECHO вместо CMD/V: ON? не смог заставить его работать – Sandra

+0

для версии allinoneline, мне не понадобится SETLOCAL ENABLEDELAYEDEXPANSION, правильно? или я должен использовать CALL ECHO в этом случае? – Sandra

+0

SETLOCAL ... означало бы, что вам не нужно использовать 'cmd/v', но, скорее всего, это будет лишним, если ваше приложение выполняет однострочный шрифт как' cmd/v ..... ' – Magoo