Показать полную графическую версию : копирование с добавлением копии
Здравствуйте увидел что вы помогали людям в создании скриптов для копирования без замены файлов, не могли бы вы помочь в еще одном таком же?
нужно чтоб с рабочего стола копировал (желательно перемещал) все файлы и папки на диск T:\ кроме *.ini *.lnk и если на диски T:\ уже имеются файлы или папки с таким-же именем то создавал их копии последовательно (файл.txt не заменял а делал файл_1.txt, файл_2.txt и так далее) спасибо.
$dest = "T:\"
$files = Get-ChildItem -Path "$env:USERPROFILE\Desktop\" -Exclude *.ini, *.lnk
if ($files -ne $null) {
foreach ($file in $files) {
$f = $file.Name
if (Test-Path (Join-Path $dest $file.Name)) {
$n = 0
while ((Test-Path (Join-Path $dest $f)) -eq $true)
{
$f = $file.BaseName + "_" + ++$n + $file.Extension
}
}
Move-Item $file.FullName (Join-Path $dest $f)
}
}
Пару-тройку интересных "трюков" в свой код "впихнул":
$source=[System.Environment]::GetFolderPath('Desktop')
$destination='T:'
$exclude=@('*.ini','*.lnk')
if(!(Test-Path -LiteralPath ($x=Join-Path $destination $Null) -PathType Container)){
"""$destination"" is not found."
$Host.UI.RawUI.ReadKey()|Out-Null}
else{
gci $source -Exclude $exclude -Force|%{
if(!(Test-Path -LiteralPath ($y="$x$($_.Name)"))){}
else{
for($i=1;;$i++){
if(!(Test-Path -LiteralPath ($y="$x$($_.BaseName)_$i$($_.Extension)"))){Break}
}
}
mi $_.FullName $y
}
}
.
Пару-тройку интересных "трюков" в свой код "впихнул":
Подскажите пожалуйста какие именно новые трюки вы добавили, чтоб знать что использовать.
Спасибо
новые трюки »
Я не писал "новые" (хотя новизна всегда относительна) и слово "трюки" писал в кавычках (вот для языка пакетных файлов можно б было писать и без кавычек, -- там ни один серьёзный код без них не обходится:)).
$x=Join-Path $destination $Null »
Поскольку в качестве значения переменной "destination" может быть указана директория как с закрывающим обратным слешем, так и без него, то данный код унифицирует это значение для дальнейшего использования только со слешем. Кстати, только сейчас обратил внимание, что при наличии слеша можно было не писать -PathType Container ».
if(!(Test-Path -LiteralPath ($y="$x$($_.Name)"))){} »
Казалось бы, что это при выполнении условие ничего не происходит, так как в фигурных скобках ничего нет, но тем не менее переменной присваивается значение в самом условии, которое затем может быть изменено, если это условик окажется ложным, причём аналогичным способом: if(!(Test-Path -LiteralPath ($y="$x$($_.BaseName)_$i$($_.Extension)"))){Break} » (поскольку кроме выхода из цикла ("Break") в фигурных скобках также ничего нет).
for($i=1;;$i++){ »
Здесь используется бесконечный цикл с последующим прерыванием в случае справедливости условия.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.