Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Копирование файла, а не ярлыка?
Goto page 1, 2, 3, 4, 5, 6  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
DjDf



Joined: 03 May 2005
Posts: 24

Post (Separately) Posted: Tue May 03, 2005 12:59    Post subject: Копирование файла, а не ярлыка? Reply with quote

Подскажите, кто знает, решение...

Проблема: в одном месте на диске хранятся файлы. Во втором - выборочные ярлыки на эти файлы. Как переписать, положим на флэшку или еще куда именно файлы, а не ярлыки?

Спасибо!
Back to top
View user's profile Send private message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Tue May 03, 2005 13:46    Post subject: Reply with quote

DjDf
может тебе попробовать плагин FileRedirector только придется все файлы на которые созданы ярлыки послать в него, но зато потом ты получишь то, что тебе надо, а если тебе это надо часто, то это самое то.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2199
Location: Москва, Россия

Post (Separately) Posted: Tue May 03, 2005 15:26    Post subject: Reply with quote

DjDf
Специально для тебя написал небольшой скриптик:
Code:
'==========================================================================
' Копирование файлов (в т.ч. файлов из ярлыков) из одной панели TC в другую
'
' В параметрах вызова из TC должно быть прописано:
' %L
'====================================================================

Dim TempFile, TCS, MyShell, FSO
Set TempFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0), 1)
Set TCS = CreateObject("TCScript.Helper")
Set MyShell = WScript.CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")

TCS.SendCommand(2030)
TrgPath = TCS.GetTextFromClip

Do While Not TempFile.AtEndOfStream
  MyFile = TempFile.ReadLine
  '----- Извлечение файла из ярлыка -----
  If FSO.GetFile(MyFile).Type = "Shortcut" Then
    MyFile = MyShell.CreateShortcut(MyFile).TargetPath
  End If
  '--------------------------------------
  If Not FSO.FileExists(TrgPath & "\" & FSO.GetFile(MyFile).Name) Then
    FSO.CopyFile MyFile, TrgPath & "\"
  End If
Loop

Сохрани в файле *.vbs, повесь файл на кнопку, в параметрах кнопки укажи %L. В скрипте для получения пути на второй панели (он будет заносится в буфер) используется TCWSHelp.
Соответственно, выделяешь файлы и ярлыки, но вместо F5 жмешь на созданную кнопку. Вместо ярлыков будут копироваться файлы. После этого нужно будет обновить (Ctrl+R) вторую файловую панель.
Back to top
View user's profile Send private message
DjDf



Joined: 03 May 2005
Posts: 24

Post (Separately) Posted: Tue May 03, 2005 17:34    Post subject: Reply with quote

Огромное спасибо!

Проделал все операции, но, к сожалению, скопировались только ярлыки, а не оригиналы. Может я что-то не так сделал?
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2199
Location: Москва, Россия

Post (Separately) Posted: Tue May 03, 2005 17:55    Post subject: Reply with quote

Странно.
Может у тебя тип файла по-другому называется.
Вставь после строчки MyFile = TempFile.ReadLine строчку:
Code:
MsgBox(FSO.GetFile(MyFile).Type)

То, что отобразит диалоговое окно для ярлыка, надо буде прописать в следующем ниже условии.
Back to top
View user's profile Send private message
DjDf



Joined: 03 May 2005
Posts: 24

Post (Separately) Posted: Tue May 03, 2005 18:40    Post subject: Reply with quote

Сенкс!!

Просто вместо If FSO.GetFile(MyFile).Type = "Shortcut" надо было написать If FSO.GetFile(MyFile).Type = "Ярлык".
Ты первый, кто наконец-то решил мою проблему. Доселе все говорили, что это нетривиально. Wink
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2199
Location: Москва, Россия

Post (Separately) Posted: Tue May 03, 2005 19:02    Post subject: Reply with quote

Отлично!
Кстати, все будет проще, если вместо ярлыков использовать жесткие ссылки. Попробуй пользоваться утилитой NTFS Links.
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 5860
Location: Москва

Post (Separately) Posted: Wed May 04, 2005 11:40    Post subject: Reply with quote

DjDf
Есть ещё один вариант: установить архиваторный плагин CopyLinkTarget и выполнять просто распаковку всех этих ярлыков в нужное место. ИМХО, достаточно удобный вариант.
Back to top
View user's profile Send private message
DjDf



Joined: 03 May 2005
Posts: 24

Post (Separately) Posted: Wed May 04, 2005 16:35    Post subject: Reply with quote

Еще раз большое спасибо за советы. Мне все же больше всего понравился вариант решения Batya, но в NTFS Links насторожило то, что в результате при попытке удаления символической ссылки Проводником будет удалено всё содержимое оригинального каталога. Ну да ладно, моя проблема решена и без символических ссылок. =)
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2199
Location: Москва, Россия

Post (Separately) Posted: Wed May 04, 2005 17:09    Post subject: Reply with quote

DjDf
Quote:
в NTFS Links насторожило то, что в результате при попытке удаления символической ссылки Проводником будет удалено всё содержимое оригинального каталога.

Меня это тоже однажды насторожило, но меня поправил, насколько я помню, именно CaptainFlint. Символическая ссылка - это ссылка на каталог. На файлы создаются жесткие ссылки. При удалении жесткой ссылки Проводником все работает корректно - другие жесткие ссылки (файлы) остаются.

Кстати, я тут подумал, что можно вышеприведенный скрипт немного упростить - тогда не понадобится TCWSHelp:
Code:
'==========================================================================
' Копирование файлов (в т.ч. файлов из ярлыков) из одной панели TC в другую
'
' В параметрах вызова из TC должно быть прописано:
' %L %T
'====================================================================

Dim TempFile, MyShell, FSO
Set TempFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0), 1)
Set MyShell = WScript.CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")

TrgPath = WScript.Arguments(1)

Do While Not TempFile.AtEndOfStream
  MyFile = TempFile.ReadLine
  '----- Извлечение файла из ярлыка -----
  If FSO.GetFile(MyFile).Type = "Shortcut" Or FSO.GetFile(MyFile).Type = "Ярлык" Then
    MyFile = MyShell.CreateShortcut(MyFile).TargetPath
  End If
  '--------------------------------------
  If Not FSO.FileExists(TrgPath & FSO.GetFile(MyFile).Name) Then
    FSO.CopyFile MyFile, TrgPath
  End If
Loop

Целевой каталог можно не вычислять, а передать от TC через %T. Обрати внимание - в параметрах кнопки надо через пробел указать %L %T.
Back to top
View user's profile Send private message
_Johm



Joined: 14 May 2006
Posts: 119

Post (Separately) Posted: Wed Feb 03, 2010 07:48    Post subject: Reply with quote

Как я понял, последний скрипт не работает с ярылками на папки?
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4558
Location: Ростов-Дон

Post (Separately) Posted: Wed Feb 03, 2010 08:40    Post subject: Reply with quote

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

Попробовал я модуль CopyLinkTarget - в принципе вполне удобно. Можно выделить все ярлыки, нажать Alt+F9 - и ТК скопирует все файлы, на которые указывают ярлыки. Мне кажется, это удобнее, чем использовать скрипты. Но с ярлыками на папки он тоже не работает, но это не очень простая задача - отображать при входе в архив содержимое некоторой папки (мне приходилось такое реализовывать).

_Johm wrote:
Как я понял, последний скрипт не работает с ярылками на папки?

Судя по тому, что написано в скрипте - не работает. Если ярлыком пользуешься только из ТК, можно просто добавить ссылку на папку в Virtual Panel - тогда можно будет входить в папку по ссылке и видеть ее реальное содержимое и копировать куда нужно.

В принципе, несложно было бы написать скрипт (даже на основании указанного), который проверял бы, файлом или папкой является целевой объект ярлыка, и в зависимости от этого выполнял бы копирование файла или папки. Но это не по мне.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
_Johm



Joined: 14 May 2006
Posts: 119

Post (Separately) Posted: Thu Feb 04, 2010 09:32    Post subject: Reply with quote

JScript для копирования объектов из ярлыков (фалы/папки).
Консольный варинат для отображения сути происходящего.
Идея по извлечению "объекта" ярлыка взята из скрипта
от Batya выше.
Code:

/*
Title: extractlnk.js
Author: John Gurin, Russia, Ekaterinburg
Date: 2010/01/04
Desc.: Copies files/folders from *.lnk target field

TOTAL COMMANDER BUTTON==============================
====================================================
TOTALCMD#BAR#DATA
cscript.exe %COMMANDER_PATH%\SCRIPTS\files_ops\extractlnk.js
%L "%T"
C:\WINDOWS\System32\CScript.exe
extractlnk
%COMMANDER_PATH%\SCRIPTS\files_ops\

-1
====================================================
*/
//SCRIPT CONFIG
var ONLYLNK = 1; //copies only *.lnk files
var WAITONFINISH = 1; //will keep console window when finished

//DECLARING
var fso, listfile, strname, sourcename, sourcebasename, strtarget, targetname;
var t="",parentfld, dirflag, fileext, optioninput, optionflag=0, rewriteflag=false;
var filler = "   ", msg, msgflag, lnkflag, tmpmsgsrcname;
var StdIn = WScript.StdIn;

var MSG_EXIST = " already exists. Rewrite?\n" +
            "[Y]=yes [N]=no [R]=rename [Q]=quit " +
            "[A]=all [E]=never";
var MSG_SUBDIR = "ERROR: COPYING A DIRECTORY TO ITS OWN SUBDIRECTORY";
var MSG_ITSELF = "ERROR: YOU CANNOT COPY A FILE TO ITSELF";

shell = new ActiveXObject("WScript.Shell");
fso = new ActiveXObject("Scripting.FileSystemObject");

//MAIN
if(WScript.arguments.length != 2){WScript.Quit();}

listfile = fso.OpenTextFile(WScript.Arguments(0), 1);
strtarget = RemoveLastSlash(WScript.Arguments(1));

Echo("Copying to " + strtarget + "\\");
while (!listfile.AtEndOfStream){
   strname = listfile.ReadLine();
   msg = "";
   msgflag = 0;
   lnkflag = 0;
   fileext = "";
   fileext = fso.GetExtensionName(strname).toUpperCase();
   if (ONLYLNK == 1 && fileext != "LNK"){continue;}
   t = RemoveLastSlash(fso.GetParentFolderName(strname));
   dirflag = (t == parentfld) ? 1 : 0;
   if (dirflag == 0){
      parentfld = t;
      dirflag = 1;
      Echo("\n" + t + "\\");
      }

   if (fileext == "LNK" && fso.FileExists(strname)){
      lnkflag=1;
      sourcename = shell.CreateShortcut(strname).TargetPath;
      Echo(filler + Truncate(fso.GetFileName(strname)));
      }else sourcename = strname;
   
   sourcename = RemoveLastSlash(sourcename);
   sourcebasename = fso.GetFileName(sourcename);
   (tmpmsgsrcname == sourcename) ? (tmpmsgsrcname = sourcebasename) : (tmpmsgsrcname = sourcebasename + "\\");
   targetname = strtarget + "\\" + sourcebasename;
   if(sourcename==targetname){Echo(filler + " TARGET = SOURCE");continue;}

   msg = Truncate(sourcebasename);
   
   if (fso.FolderExists(sourcename)){
      (lnkflag==1) ? (msg = filler + " DIR " + msg):(msg = filler + msg);
      msg+="\\";
      if(fso.FolderExists(targetname)){
         if(optionflag==0){
            Echo(msg + MSG_EXIST);
            msgflag = 1;
            optioninput = WaitInput(1);
            switch (optioninput.toUpperCase()){
               case "Y":
                  rewriteflag=true;
                  break;
               case "N":
                  rewriteflag=false;
                  break;
               case "A":
                  rewriteflag=true;
                  optionflag=1;
                  break;
               case "E":
                  rewriteflag=false;
                  optionflag=1;
                  break;
               case "R":
                  while(fso.FolderExists(targetname)){
                     targetname=strtarget + "\\" + WaitInput(2);
                  }
                  rewriteflag=1;
                  break;
               case "Q":
                  WScript.Quit();
            }
         }
         if(rewriteflag){
            (msgflag == 0) ? Echo(msg):false;
            try{fso.CopyFolder(sourcename, targetname, true);
               }catch(e){Echo(MSG_SUBDIR);}
            }
      }else{
         Echo(msg);
         try{fso.CopyFolder(sourcename, targetname, true);
            }catch(e){Echo(MSG_SUBDIR);}
         }
      
   }else if(fso.FileExists(sourcename)){  //file operation
         (lnkflag==1) ? (msg = filler + " FILE " + msg):(msg = filler + msg);
         if(fso.FileExists(targetname)){
            if(optionflag==0){
               Echo(msg + MSG_EXIST);
               msgflag = 1;
               optioninput = WaitInput(1);
               switch (optioninput.toUpperCase()){
                  case "Y":
                     rewriteflag=true;
                     break;
                  case "N":
                     rewriteflag=false;
                     break;
                  case "A":
                     rewriteflag=true;
                     optionflag=1;
                     break;
                  case "E":
                     rewriteflag=false;
                     optionflag=1;
                     break;
                  case "R":
                     while(fso.FileExists(targetname)){
                        targetname=strtarget + "\\" + WaitInput(2);
                     }
                     rewriteflag=1;
                     break;
                  case "Q":
                     WScript.Quit();
               }
            }
            if(rewriteflag){
               (msgflag == 0) ? Echo(msg):false;
               try{fso.CopyFile(sourcename, targetname, true);
                  }catch(e){Echo(MSG_ITSELF);}
            }
         }else{
            Echo(msg);
            try{fso.CopyFile(sourcename, targetname, true);
               }catch(e){Echo(MSG_ITSELF);}
            }
      }else{(lnkflag==1) ? Echo(filler + " TARGET MISSING " + Truncate(tmpmsgsrcname)) :
                     Echo(filler + "CANT FIND " + Truncate(tmpmsgsrcname));}
   }//while filelist
   

listfile.Close();
if(WAITONFINISH) WaitInput(0);

//FUNCTIONS
function WaitInput(mode){
   switch(mode){
      case 0:
      Echo("\nDone\nPress Enter");
      break;
      case 2:
      Echo("Enter new name:")
      break;
   }
   return(StdIn.ReadLine());
 }
function RemoveLastSlash(str){
 if (str.substring(str.length-1, str.lenght) == "\\")
   {
   str = str.slice(0,-1);
   }
   return(str);
 }
function Echo(str){
 WScript.Echo(str);
 }
function Truncate(str){
 var P = 40;
 if (str.length > P)
   {
   str = str.slice(0,P) + ".(...)." + fso.GetExtensionName(str);
   }
   return(str);
 }


Last edited by _Johm on Thu Feb 04, 2010 16:43; edited 2 times in total
Back to top
View user's profile Send private message
_Johm



Joined: 14 May 2006
Posts: 119

Post (Separately) Posted: Thu Feb 04, 2010 12:31    Post subject: Reply with quote

Куда воткнуть ECHO OFF. в код или в кнопку, чтобы в консоли
не было команд?
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2199
Location: Москва, Россия

Post (Separately) Posted: Fri Feb 05, 2010 02:25    Post subject: Reply with quote

_Johm wrote:
Как я понял, последний скрипт не работает с ярылками на папки?

Так ведь никто и не заказывал.
Этот скрипт работает с ярлыками папок:
Code:
'===================================================
' Копирование файлов\папок (в т.ч. из ярлыков)
'
' Параметры:
' {файл-список} {целевая папка}
'
' Пример параметров при вызове из TC:
' %L "%T"
'===================================================

Dim FF, WSH, FSO, TrgPath, F, NewPath
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")
Set FF  = FSO.OpenTextFile(WScript.Arguments(0), 1)

TrgPath = WScript.Arguments(1)

Do While Not FF.AtEndOfStream
  F = FF.ReadLine
  If Right(F, 1) = "\" Then F = Left(F, Len(F) - 1)
  '----- Извлечение из ярлыка -----
  If LCase(FSO.GetExtensionName(F)) = "lnk" Then
    F = WSH.CreateShortcut(F).TargetPath
  End If
  '--------------------------------
  If FSO.FileExists(F) Then
    NewPath = TrgPath & FSO.GetFile(F).Name
    If Not FSO.FileExists(NewPath) Then
      FSO.CopyFile F, TrgPath
    End If
  End If
  If FSO.FolderExists(F) Then
    NewPath = TrgPath & FSO.GetFolder(F).Name
    If Not FSO.FolderExists(NewPath) Then
      FSO.CopyFolder F, TrgPath
    End If
  End If
Loop
FF.Close
Set FF  = Nothing
Set WSH = Nothing
Set FSO = Nothing
WScript.Quit 0

_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2, 3, 4, 5, 6  Next
Page 1 of 6

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group