使用Powershell复制文件后重命名文件

4

我是一个有用的助手,可以为您翻译文本。

我正在遇到一个持续的问题,我已经编写了一个脚本,它(应该)完成以下操作。

我有一个包含多个csv文件的文件夹,并且我想将最新的公司名称文件复制到另一个文件夹中,并将其重命名。

目前格式如下:

21Feb17070051_CompanyName_Sent21022017

我希望您能按照以下格式提供内容:

我想要以下格式:

CompanyName21022017

所以我有以下的PowerShell脚本来完成这个任务:
## Declare variables ##

$DateStamp = get-date -uformat "%Y%m%d"
$csv_dest = "C:\Dest"
$csv_path = "C:\Location"

## Copy latest Company CSV file ##

get-childitem -path $csv_path -Filter "*Company*.csv" | 
    where-object { -not $_.PSIsContainer } | 
    sort-object -Property $_.CreationTime | 
    select-object -last 1 |
    copy-item -Destination $csv_dest

## Rename the file that has been moved ##

get-childitem -path $csv_dest -Filter "*Company*.csv" | 
    where-object { -not $_.PSIsContainer } | 
    sort-object -Property $_.CreationTime | 
    select-object -last 1 | rename-item $file -NewName {"Company" + $DateStamp + ".csv"} 

文件复制似乎没有问题,但重命名失败 -
Rename-Item : Cannot bind argument to parameter 'Path' because it is null.
At C:\Powershell Scripts\MoveCompanyFiles.ps1:20 char:41
+     select-object -last 1 | rename-item $file -NewName {"CompanyName" + $DateSt ...

我觉得这可能与powershell的工作顺序有关,或者它无法看到$file变量中的.csv文件有关。如果目标位置中还有其他文件(文本文件、批处理文件),可能会影响事情的进行。 如果能帮忙找出问题所在,将不胜感激。


4
$file 未定义且不需要。该 cmdlet 会从管道中获取文件参数。 - wOxxOm
完美...总是有些简单的东西!谢谢。 - Ricky
2个回答

5
如wOxxOm所述,你需要从Rename-Item中删除$file,因为它没有定义,而该命令已通过管道接收了输入对象。
我还建议通过将复制的文件的fileinfo对象传递给Rename-Item来合并这两个操作。例如:
## Declare variables ##

$DateStamp = get-date -uformat "%Y%m%d"
$csv_dest = "C:\Dest"
$csv_path = "C:\Location"

## Copy and rename latest Company CSV file ##

Get-ChildItem -Path $csv_path -Filter "*Company*.csv" | 
Where-Object { -not $_.PSIsContainer } | 
Sort-Object -Property CreationTime | 
Select-Object -Last 1 |
Copy-Item -Destination $csv_dest -PassThru |
Rename-Item -NewName {"Company" + $DateStamp + ".csv"}

3

您可以使用Copy-Item命令并将新路径和名称作为-Destination参数值来一次性重命名和复制文件。它会复制并重命名文件。下面是一个示例:

$source_path = "c:\devops\test"
$destination_path = "c:\devops\test\"
$file_name_pattern = "*.nupkg"

get-childitem -path $source_path -Filter $file_name_pattern | 
Copy-Item -Destination { $destination_path + $_.Name.Split("-")[0] + ".nupkg"}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接