2014-02-09 3 views
1

Как копировать имена папок в имена файлов во время копирования. В настоящий момент скрипт копирует только файлы из поддиректории без всякой папки и подпапки. Тем не менее, я хочу, что при копировании принимает абсолютный путь.PowerShell добавляет полный путь к имени файла и копирует

Вот пример: Folder1 Subfolder1 Subfolder2 Subfolder3 Subfolder4 File1 Folder2

Затем скопированный файл будет называться так:

Folder1_Subfolder1_Subfolder2_Subfolder3_Subfolder4_File.pdf

 Powershell code: 
    Get-ChildItem –path C:\12 -Recurse -Include "*.???" | 
    Foreach-Object { copy-item -Path $_.fullname -Destination c:\12 } 
+0

Если вы это сделаете, разве вы не просто скопируете их обратно в то же место? – mjolinor

ответ

1

Хорошо, если я правильно вас понять, вы хотите файл как:

C:\12\foo\bar\baz.txt 

Чтобы быть скопирована:

C:\12\foo_bar_baz.txt 

Если я понимаю, что правильно, а затем что-то вроде следующее должно работать:

function Copy-FileUsePath { 
[cmdletbinding()] 
    param(
     [parameter(Mandatory=$true,Position=0)][string]$Path, 
     [parameter(Mandatory=$true,Position=1)][string]$Destination 
    ) 

    $files = Get-ChildItem -Path $Path -Recurse -Include "*.???" 
    foreach ($file in $files) { 
     $discard = $Destination.Length 
     if($Destination -notlike "*\") { 
      $discard++ 
     } 
     $newFileName = $file.FullName.Replace('\', '_').Remove(0, $discard) 
     $newFile = $Destination + '\' + $newFileName 
     Write-Verbose "Copy-Item -Path $file.fullname -Destination $newFile" 
     Copy-Item -Path $file.fullname -Destination $newFile 
    } 
} 

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

. .\Copy-FileUsePath.ps1 
Copy-FileUsePath -Path C:\12 -Destination C:\export 
+0

@HunterEdison: Я предполагаю, что вы хотите заменить '.Substring (3)' на '.Replace ($ Destination," ")' или '.Remove (0, $ Destination.length)' на перенос –

+0

Привет thx для ваша помощь да, вы правы. Но можете ли вы изменить свою функцию так, чтобы я мог поместить путь и назначение как переменную в исходный код. Вы можете использовать c: \ 12 как путь и c: \ export as destination Извините, у меня мало опыта в powershell. – zero1de

+0

Я получаю и ошибку, если я вызываю функцию: Copy-FileUsePath ("D: \ test \ Folder1", "D: \ test") error msg = Copy-FileUsePath: Die Argumenttransformation für den Параметр «Путь» kann nicht verarbeitet werden , Der Wert kann nicht in den Typ «System.String» konvertiert werden. Bei Zeile: 18 Zeichen: 17+ Copy-FileUsePath <<<< («D: \ test \ Folder1», «D: \ test») + CategoryInfo: InvalidData: (:) [Copy-FileUsePath], ParameterBindin .. .mationException + FullyQualifiedErrorId: ParameterArgumentTransformationError, Copy-FileUsePath – zero1de

Смежные вопросы