2017-02-21 1 views
1

nach dem Kopieren Ich habe laufende Probleme mit einem Skript, das ich geschrieben habe, dass ist (angeblich) folgende zu tun. Ich habe einen Ordner mit einer Reihe von CSV-Dateien, und ich möchte die neueste Datei mit dem Firmennamen in einen anderen Ordner kopieren und umbenennen.Powershell -renaming eine Datei

Es ist im aktuellen Format:

21Feb17070051_CompanyName_Sent21022017 

ich es in folgendem Format will:

CompanyName21022017 

Also habe ich folgenden Powershell-Skript, dies zu tun:

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

die Datei scheint ok zu kopieren, aber die Umbenennungs versagt -

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 ... 

Ich denke, es hat etwas mit der Reihenfolge zu tun, in der Powershell funktioniert, oder die Tatsache, dass es die .csv in der Variablen $ Datei nicht sehen kann. Es gibt andere Dateien (Textdateien, Batch-Dateien) im Ziel, falls sich das auf die Dinge auswirkt. Jede Hilfe in denen ich falsch liege würde geschätzt.

+4

'$ Datei' ist nicht definiert und wird nicht benötigt. Das Cmdlet ruft den Dateiparameter aus der Pipeline ab. – wOxxOm

+0

Perfekt ... immer etwas Einfaches! Vielen Dank. – Ricky

Antwort

2

Da wOxxOm geantwortet hat, müssen Sie $file von Rename-Item entfernen, da es nicht definiert ist und das Cmdlet das Eingabeobjekt bereits über die Pipeline empfängt.

Ich würde auch vorschlagen, dass Sie die beiden Operationen kombinieren, indem Sie das fileinfo -Objekt für die kopierte Datei an Rename-Item übergeben. Ex:

## 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

Sie umbenennen und kopieren Sie in einem einzigen Befehl. Verwenden Sie einfach den Copy-Item-Befehl und geben Sie einen neuen Pfad und Namen als "Destination-Parameterwert" ein. Es wird die Datei kopieren und umbenennen. Sie können ein Beispiel unten finden.

$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"} 
Verwandte Themen