我已经使用Windows CMD Shell多年了,但我决定切换到PowerShell。
我在cmd shell中的命令以备份一个添加日期和时间的文件:
copy /-Y "D:MyFilesworkat.txt" d:bkp_workat_'. strftime("%Y-%m-%d_%H-%M", getftime('D:MyFilesworkat.txt')) .'.txt'
workat.txt --> bkp_workat_2019-02-14_17-52.txt
PowerShell中的同一命令:
$RCTime = (ls D:MyFilesworkat.txt).LastWriteTime
$myDate = $RCTime.ToString('yyy-MM-dd_HH-mm')
Copy-Item D:MyFilesworkat.txt -destination "D:MyFilesworkat_$myDate.txt"
这可以正常工作,但是我需要将3个命令组合在一个命令中。
这就是我所做的:
$RCTime = (ls D:MyFilesworkat.txt).LastWriteTime | $myDate = $RCTime.ToString('yyy-MM-dd_HH-mm') | Copy-Item D:MyFilesworkat.txt -destination "D:MyFilesworkat_$myDate.txt"
这给出了一个错误:Expressions are only allowed as the first element of a pipeline
我错了什么?
使用 ;
进行雏菊链独立语句。使用管道(|
)将一个命令的输出连接到另一个命令的输入。
您还可以雏菊链点 - 访问属性和方法:
(ls D:MyFilesworkat.txt).LastWriteTime.ToString('yyy-MM-dd_HH-mm')
但是,原始命令的最豪华翻译可能看起来有些类似:
Get-Item 'D:MyFilesworkat.txt' |
Copy-Item -Destination { 'D:MyFilesworkat_{0:yyy-MM-dd_HH-mm}.txt' -f $_.LastWriteTime }
或以下:
Get-Item 'D:MyFilesworkat.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
cmdlet和字符串串联来构建从输入对象的各个属性构建目标路径的构建目标。
尝试以下:
$RCTime = (ls C:MyFilesworkat.txt).LastWriteTime;$myDate = $RCTime.ToString('yyy-MM-dd_HH-mm') | Copy-Item D:MyFilesworkat.txt -destination "C:MyFilesworkat_$myDate.txt"
您正在尝试将另一个变量送到另一个变量。因此,为什么要遇到错误。只是好奇,您为什么要在一行上构建所有内容?这样做是很好的做法:
$RCTime = (ls C:MyFilesworkat.txt).LastWriteTime
$myDate = $RCTime.ToString('yyy-MM-dd_HH-mm')
Copy-Item D:MyFilesworkat.txt -destination "C:MyFilesworkat_$myDate.txt"
管道期望根据所调用的cmdlet进行明确数据。在您的示例中,您设置了等于CMDLET的变量,然后尝试将其输送到下一个命令。您实际上只能每行有一个变量集,但是如果您切换出半龙的管道,它应该有效,但不能最好地练习。
如果您想做一个真正的衬里,则需要嵌套呼叫,并且看起来像这样。
Copy-Item D:MyFilesworkat.txt -destination "D:MyFilesworkat_$($(Get-ChildItem D:MyFilesworkat.txt).LastWriteTime.ToString("yyyy-MM-dd_HH-mm")).txt"
()是将一个命令的结果嵌入到另一个命令中的一种方法。您基本上是在$ rctime
的集合中这样做的Copy-Item D:MyFilesworkat.txt -destination "D:MyFilesworkat_$((ls D:MyFilesworkat.txt).LastWriteTime.ToString('yyy-MM-dd_HH-mm')).txt"