我正在编写一个我编写的脚本(假设)执行以下操作时遇到的问题。 我有一个包含许多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这一事实。如果影响了某些事情,目标中还有其他文件(文本文件,批处理文件)。 如果我出错了任何帮助,我们将不胜感激。
答案 0 :(得分:2)
当wOxxOm回答时,您需要从$file
中删除Rename-Item
,因为它未定义且cmdlet已通过管道接收输入对象。
我还建议您通过将复制文件的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"}
答案 1 :(得分:1)
您可以在一个命令中重命名和复制。只需使用Copy-Item Command并将新路径和名称命名为-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"}