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 . . .
спасибо !, как бы код работы с CALL-ECHO вместо CMD/V: ON? не смог заставить его работать – Sandra
для версии allinoneline, мне не понадобится SETLOCAL ENABLEDELAYEDEXPANSION, правильно? или я должен использовать CALL ECHO в этом случае? – Sandra
SETLOCAL ... означало бы, что вам не нужно использовать 'cmd/v', но, скорее всего, это будет лишним, если ваше приложение выполняет однострочный шрифт как' cmd/v ..... ' – Magoo