Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   копирование с добавлением копии (http://forum.oszone.net/showthread.php?t=299927)

tosina 18-05-2015 09:51 2508585

копирование с добавлением копии
 
Здравствуйте увидел что вы помогали людям в создании скриптов для копирования без замены файлов, не могли бы вы помочь в еще одном таком же?
нужно чтоб с рабочего стола копировал (желательно перемещал) все файлы и папки на диск T:\ кроме *.ini *.lnk и если на диски T:\ уже имеются файлы или папки с таким-же именем то создавал их копии последовательно (файл.txt не заменял а делал файл_1.txt, файл_2.txt и так далее) спасибо.

corbis 18-05-2015 22:41 2508855

Код:

$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)
    }
}


Georgio 19-05-2015 04:56 2508879

Пару-тройку интересных "трюков" в свой код "впихнул":


Код:

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


.

tosina 21-05-2015 02:18 2509639

Цитата:

Пару-тройку интересных "трюков" в свой код "впихнул":
Подскажите пожалуйста какие именно новые трюки вы добавили, чтоб знать что использовать.
Спасибо

Georgio 21-05-2015 11:15 2509733

Цитата:

Цитата tosina
новые трюки »


Я не писал "новые" (хотя новизна всегда относительна) и слово "трюки" писал в кавычках (вот для языка пакетных файлов можно б было писать и без кавычек, -- там ни один серьёзный код без них не обходится:)).



Цитата:

Цитата Georgio
Код:

$x=Join-Path $destination $Null
»


Поскольку в качестве значения переменной "destination" может быть указана директория как с закрывающим обратным слешем, так и без него, то данный код унифицирует это значение для дальнейшего использования только со слешем. Кстати, только сейчас обратил внимание, что при наличии слеша можно было не писать
Цитата:

Цитата Georgio
Код:

-PathType Container
»

.



Цитата:

Цитата Georgio
Код:

if(!(Test-Path -LiteralPath ($y="$x$($_.Name)"))){}
»


Казалось бы, что это при выполнении условие ничего не происходит, так как в фигурных скобках ничего нет, но тем не менее переменной присваивается значение в самом условии, которое затем может быть изменено, если это условик окажется ложным, причём аналогичным способом:
Цитата:

Цитата Georgio
Код:

if(!(Test-Path -LiteralPath ($y="$x$($_.BaseName)_$i$($_.Extension)"))){Break}
»

(поскольку кроме выхода из цикла ("Break") в фигурных скобках также ничего нет).



Цитата:

Цитата Georgio
Код:

for($i=1;;$i++){
»


Здесь используется бесконечный цикл с последующим прерыванием в случае справедливости условия.


Время: 14:28.

Время: 14:28.
© OSzone.net 2001-