2015-09-06 2 views
0

Я пытаюсь создать пакетный скрипт, содержащий PowerShell, чтобы получить вчерашнюю дату.Запись командного файла с помощью PowerShell

До сих пор мне удалось написать «получить дату» часть, которая, как показано ниже:

powershell $date=Get-Date; $date=$date.AddDays(-1); $date.ToString('yyyyMMdd') 

Как я могу передать переменную $date обратно в пакетный скрипт, так что я могу использовать переменная $date для перемещения файлов? То, что я пытаюсь достичь здесь рассматривается ниже:

move *%date%*.xml D:\Sample\ 

И я хотел бы сделать это в рамках одного пакетного сценария.

+1

Почему бы не написать весь сценарий в Powershell так что вам не нужно передавать дату? – alroc

ответ

1

Если я правильно понял ваш вопрос, вы хотите написать Batch Script (.bat), который использует Powershell для получения предыдущей даты.

Ниже приведено то, что вы можете поместить в свой .bat Сценарий, чтобы получить значение.

powershell -Command (Get-Date).AddDays(-1).ToString('yyyyMMdd')

Вы не нужно "пройти обратно" переменную. Вместо этого вы просто делаете вывод powershell называть нужную вам информацию. Используя свой код, который вы опубликовали, выход отсутствует. Однако использование вышеизложенного будет эквивалентно «возврату» переменной $date в ваш код.

Пакет действительно не имеет простого способа захвата переменной. Существует два основных способа захвата переменных. Вы либо используете цикл for (это своего рода хак), либо записываете вывод в файл, а затем читаете этот файл в переменной.

Метод 1 - For Loop
Вот код, чтобы захватить вывод в переменную с именем v (доступ с %v%).

for /f %d in (
    'powershell.exe -Command "(Get-Date).AddDays(-1).ToString(\"yyyyMMdd\")"' 
) do set "v=%d" 

Метод 2 - Файл Выход
Здесь мы пишем вывод Powershell в файл, имя которого хранится в переменной tempFile. Затем мы читаем содержимое файла обратно в переменную с именем v. Наконец, мы удаляем tempFile.

powershell.exe -Command (Get-Date).AddDays(-1).ToString('yyyyMMdd') > %tempFile% 
set /p v=< %tempFile% 
del %tempFile% 
+0

Спасибо за уведомление, забыли об этом. Я обновил ответ двумя основными методами для захвата вывода команды в переменные. – nehcsivart

0

Вы можете также сделать это в CMD.exe укомплектовать, хотя это немного более сложным ...

:Get_Dates 
set day=%DATE:~-10,2% 
set month=%DATE:~-7,2% 
set year=%DATE:~-4% 

set TODAY=%year%-%month%-%day% 

set /a tag-=1 
if %day% LEQ 0 set /a monat-=1 
if %month% LEQ 0 set /a jahr-=1 & set monat=12 

if %day% GEQ 1 goto :done 
rem day is in the previous month 
if %month% EQU 1 set tag=31 
if %month% EQU 3 set tag=31 
if %month% EQU 4 set tag=30 
if %month% EQU 5 set tag=31 
if %month% EQU 6 set tag=30 
if %month% EQU 7 set tag=31 
if %month% EQU 8 set tag=31 
if %month% EQU 9 set tag=30 
if %month% EQU 10 set tag=31 
if %month% EQU 11 set tag=30 
if %month% EQU 12 set tag=31 

if %month% NEQ 2 goto :done 
rem februar so check year 
set /a mod4=year % 4 
set /a mod100=year % 100 
set /a mod400=year % 400 
set day=28 
if %mod4% NEQ 0 goto :done 
set day=29 
if %mod100% NEQ 0 goto :done 
set day=28 
if %mod400% NEQ 0 goto :done 
set day=29 

:done 
1

Вы можете запустить из командной строки PowerShell следующим образом, чтобы получить значение в переменной в командном сценарии:

@echo off 

for /f "tokens=* delims=" %%d in (
    'powershell.exe -Command "(Get-Date).AddDays(-1).ToString(\"yyyyMMdd\")"' 
) do set "yesterday=%%d" 

move *%yesterday%*.xml D:\Sample\ 

Вы не должны назвать переменную %date%, потому что это переменная CMD заполнятся автоматически с текущей датой. См. help set:

% DATE% - расширяется до текущей даты в том же формате, что и команда DATE.


Однако, как @alroc предложил в комментариях к вашему вопросу, вероятно, было бы проще просто написать весь сценарий PowerShell:

$yesterday = (Get-Date).AddDays(-1).ToString('yyyyMMdd') 
Move-Item "*$yesterday*.xml" 'D:\Sample' 
+0

Является ли цитирование справа в 'D: \ Sample' в последнем скрипте? – foxidrive

+0

@foxidrive Должно быть. Зачем? –

+0

Два термина на последней строке имеют разные кавычки. Это неправильно? Или оба? – foxidrive

Смежные вопросы