2015-02-05 3 views
1

У меня есть путь в переменной (параметр скрипта) %2. Мне нужно сделать следующее:Использование вывода команды PowerShell в пакетном файле Windows

  1. Извлеките лист (последнюю папку с пути) в переменную.
  2. Выполните следующую команду: robocopy %2 \\somepath\%leaf

Мне сказали, что это может быть сделано в PowerShell (потому что я пытался идти с только пакетный файл и с треском провалились) Вот псевдокод представление о том, что я хотел бы достижения:

set leaf = powershell -command (split-path %2 -leaf) 
robocopy %2 \\somepath\%leaf 

Любая идея, как правильно это записать? Спасибо.

+0

Можете ли вы дать мне пример с некоторых фиктивных имен папок? Мне тяжело следовать за вами с использованием% 2. Пакетный скриптинг - это не моя сила, а PowerShell. – FoxDeploy

+0

Извините, но это было бесполезно для меня. Как и вы, я могу закодировать в PowerShell, а не в пакетном режиме. Мне нужно написать командную команду, чтобы она работала в моем пакетном скрипте с% 2 и всеми. – Shaggydog

+0

любая причина, по которой вы не можете запустить robocopy изнутри powershell. В теории вы можете использовать пакетный оператор FOR для получения вывода из powershell, но почему? например $ leaf = (split-path% 2 -laf); robocopy% 2 \ somepath \ $ leaf –

ответ

2

Всякий раз, когда вы хотите установить пакетную переменную на вывод команды, используйте for /f. Вот пример:

@echo off 
setlocal 

set "psCommand=powershell -command "(split-path '%~2' -leaf)"" 
for /f "delims=" %%I in ('%psCommand%') do set "leaf=%%I" 

echo %leaf% 

Но это очень неэффективный способ получить последнюю папку пути. Вместо вызова PowerShell, что вы должны сделать это:

@echo off 
setlocal 

for %%I in ("%~2") do set "leaf=%%~nxI" 

echo %leaf% 

%%~dpnxI нотация получает

  • д = привод
  • р = путь
  • п = имя
  • х = расширение

Это традиционно предназначено для файлов, а не для каталогов; но он так же хорошо подходит для каталогов. Для получения полной информации см. Последние две страницы for /? в окне консоли.

+0

Спасибо, что в итоге работал (второй вариант). Я понятия не имею, как и почему он работает, и я боролся с этим часами. Кроме того, в вашем первом примере, почему robocopy является частью команды powershell? – Shaggydog

+0

@Shaggydog Ваш вопрос был первоначально отформатирован с помощью 'robocopy' в той же строке, что и' split-path'. Я не обращал достаточно пристального внимания на то, действительно ли это PowerShell-ese или нет. Ред. – rojo

0
FOR %%a IN ("%~2") DO FOR %%b IN ("%%~dpa.") DO ECHO %%~nxb 

Пакет однострочный. Возьмите параметр (второй параметр здесь), удалите любые кавычки и повторно примените их. Выберите диск и путь, добавьте '.' затем выберите имя и расширение требуемого результата.

Очевидно, что если вам требуется это в переменной,

FOR %%a IN ("%~2") DO FOR %%b IN ("%%~dpa.") DO set "leaf=%%~nxb" 
Смежные вопросы