2017-02-21 8 views
1

У меня возникают проблемы со сценарием, который я написал, который (предположительно) должен сделать следующее. У меня есть одна папка с несколькими файлами csv, и я хочу скопировать последний файл с именем компании в другую папку и переименовать его.Powershell - уничтожение файла после копирования

Он находится в текущем формате:

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"} 

Файл, похоже, скопирован, но переименование не удалось -

Я думаю, что это как-то связано с порядком работы powershell или фактом, что он не может видеть .csv в переменной $ file. В месте назначения есть другие файлы (текстовые файлы, пакетные файлы), если это влияет на вещи. Любая помощь в том, где я ошибаюсь, будет оценена по достоинству.

+4

'$ file' не определен и не требуется. Командлет получает параметр файла из конвейера. – wOxxOm

+0

Отлично ... всегда что-то просто! Благодарю. – Ricky

ответ

2

Как ответил wOxxOm, вам необходимо удалить $file из Rename-Item, поскольку он не определен, и командлет уже получает объект ввода через конвейер.

Я также предложил бы объединить две операции, пройдя через 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

Вы можете переименовать и скопировать в одной команде. Просто используйте команду «Копировать-элемент» и укажите новый путь и имя как параметр параметра «Определение». Он скопирует и переименует файл. Ниже приведен пример.

$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"} 
Смежные вопросы