Объедините команды в Powershell - PullRequest
0 голосов
/ 14 февраля 2019

Я годами использовал оболочку windows cmd, но решил перейти на powershell.

Моя команда в оболочке cmd для создания резервной копии файла с добавлением даты и времени:

copy /-Y "D:\MyFiles\workat.txt" d:\bkp_workat_'. strftime("%Y-%m-%d_%H-%M", getftime('D:\MyFiles\workat.txt')) .'.txt'

workat.txt --> bkp_workat_2019-02-14_17-52.txt

Та же команда в powershell:

$RCTime = (ls D:\MyFiles\workat.txt).LastWriteTime 
$myDate = $RCTime.ToString('yyy-MM-dd_HH-mm') 
Copy-Item D:\MyFiles\workat.txt -destination "D:\MyFiles\workat_$myDate.txt"

Это прекрасно работает, но мне нужно объединить 3 команды в одну команду.

Это то, что я сделал:

$RCTime = (ls D:\MyFiles\workat.txt).LastWriteTime | $myDate = $RCTime.ToString('yyy-MM-dd_HH-mm') | Copy-Item D:\MyFiles\workat.txt -destination "D:\MyFiles\workat_$myDate.txt"

Это выдает ошибку: Expressions are only allowed as the first element of a pipeline

Что я сделал не так?

Ответы [ 4 ]

0 голосов
/ 14 февраля 2019

Конвейеры ожидают явных данных в зависимости от вызываемого CMDLET.В вашем примере вы устанавливаете переменные, равные CMDLET, а затем пытаетесь передать это следующей команде.На самом деле вы можете установить только одну переменную на строку, но если вы переключаете каналы на точки с запятой, это должно сработать, но это не лучший метод.

Если вы хотите создать истинный один слой, вам нужно вложить свойзвонки, и это будет выглядеть примерно так.

Copy-Item D:\MyFiles\workat.txt -destination "D:\MyFiles\workat_$($(Get-ChildItem D:\MyFiles\workat.txt).LastWriteTime.ToString("yyyy-MM-dd_HH-mm")).txt"
0 голосов
/ 14 февраля 2019

() - это способ встроить результаты одной команды в вызов другой команды.Вы в основном делали это с набором $ RCTime

Copy-Item D:\MyFiles\workat.txt -destination "D:\MyFiles\workat_$((ls D:\MyFiles\workat.txt).LastWriteTime.ToString('yyy-MM-dd_HH-mm')).txt"
0 голосов
/ 14 февраля 2019

Используйте ; для независимых последовательных операторов.Используйте канал (|) для подключения вывода одной команды к входу другой.

Вы также можете использовать последовательный доступ к свойствам и методам:

(ls D:\MyFiles\workat.txt).LastWriteTime.ToString('yyy-MM-dd_HH-mm')

Тем не менее, большинство переводов PoSh ваших исходных команд, вероятно, будет выглядеть примерно так:

Get-Item 'D:\MyFiles\workat.txt' |
    Copy-Item -Destination { 'D:\MyFiles\workat_{0:yyy-MM-dd_HH-mm}.txt' -f $_.LastWriteTime }

или это:

Get-Item 'D:\MyFiles\workat.txt' |
    Copy-Item -Destination { Join-Path $_.DirectoryName ($_.BaseName + $_.LastWriteTime.ToString('_yyy-MM-dd_HH-mm') + $_.Extension }

Get-Item создает объект FileInfo из заданногопуть и передает это Copy-Item по конвейеру.Поскольку Copy-Item может читать входные данные из конвейера, вам не нужно указывать источник (как он поступает из конвейера), а только пункт назначения.А так как вы читаете из конвейера, вы можете использовать переменную текущего объекта $_ для доступа к свойствам исходного объекта (примечание: вам нужен блок скриптов, то есть фигурные скобки вокруг выражения, чтобы это работало).

В первом примере используется оператор форматирования -f для вставки даты в строку пути, во втором примере используется командлет Join-Path и конкатенация строк для построения пути назначения из различных свойств входного объекта.

0 голосов
/ 14 февраля 2019

Попробуйте это:

$RCTime = (ls C:\MyFiles\workat.txt).LastWriteTime;$myDate = $RCTime.ToString('yyy-MM-dd_HH-mm') | Copy-Item D:\MyFiles\workat.txt -destination "C:\MyFiles\workat_$myDate.txt"

Вы пытаетесь передать другую переменную по конвейеру.Следовательно, почему вы получаете ошибку.И просто любопытно, почему вы хотите структурировать все это в одну строку?Это хорошая практика делать это так:

$RCTime = (ls C:\MyFiles\workat.txt).LastWriteTime
$myDate = $RCTime.ToString('yyy-MM-dd_HH-mm')
Copy-Item D:\MyFiles\workat.txt -destination "C:\MyFiles\workat_$myDate.txt"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...