| View previous topic :: View next topic   | 
	 
	
	
		| Author | 
		Message | 
	 
	
		DjDf
 
 
  Joined: 03 May 2005 Posts: 24
 
  | 
		
			
				  (Separately) Posted: Tue May 03, 2005 12:59    Post subject: Копирование файла, а не ярлыка? | 
				     | 
			 
			
				
  | 
			 
			
				Подскажите, кто знает, решение...
 
 
Проблема: в одном месте на диске хранятся файлы. Во втором - выборочные ярлыки на эти файлы. Как переписать, положим на флэшку или еще куда именно файлы, а не ярлыки?
 
 
Спасибо! | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		Parcan
 
  
  Joined: 15 Dec 2004 Posts: 399 Location: Russian
  | 
		
			
				  (Separately) Posted: Tue May 03, 2005 13:46    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				DjDf
 
может тебе попробовать плагин FileRedirector только придется все файлы на которые созданы ярлыки послать в него, но зато потом ты получишь то, что тебе надо, а если тебе это надо часто, то это самое то. | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		Batya
 
  
  Joined: 15 Dec 2004 Posts: 2229 Location: Москва, Россия
  | 
		
			
				  (Separately) Posted: Tue May 03, 2005 15:26    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				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 | 
		 | 
	 
	
		  | 
	 
	
		DjDf
 
 
  Joined: 03 May 2005 Posts: 24
 
  | 
		
			
				  (Separately) Posted: Tue May 03, 2005 17:34    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Огромное спасибо!
 
 
Проделал все операции, но, к сожалению, скопировались только ярлыки, а не оригиналы. Может я что-то не так сделал? | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		Batya
 
  
  Joined: 15 Dec 2004 Posts: 2229 Location: Москва, Россия
  | 
		
			
				  (Separately) Posted: Tue May 03, 2005 17:55    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Странно.
 
Может у тебя тип файла по-другому называется.
 
Вставь после строчки MyFile = TempFile.ReadLine строчку:
 
 	  | Code: | 	 		  MsgBox(FSO.GetFile(MyFile).Type)  | 	  
 
То, что отобразит диалоговое окно для ярлыка, надо буде прописать в следующем ниже условии. | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		DjDf
 
 
  Joined: 03 May 2005 Posts: 24
 
  | 
		
			
				  (Separately) Posted: Tue May 03, 2005 18:40    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Сенкс!!
 
 
Просто вместо   If FSO.GetFile(MyFile).Type = "Shortcut" надо было написать   If FSO.GetFile(MyFile).Type = "Ярлык".
 
Ты первый, кто наконец-то решил мою проблему. Доселе все говорили, что это нетривиально.    | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		Batya
 
  
  Joined: 15 Dec 2004 Posts: 2229 Location: Москва, Россия
  | 
		
			
				  (Separately) Posted: Tue May 03, 2005 19:02    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Отлично!
 
Кстати, все будет проще, если вместо ярлыков использовать жесткие ссылки. Попробуй пользоваться утилитой NTFS Links. | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		CaptainFlint
 
  
  Joined: 14 Dec 2004 Posts: 6206 Location: Москва
  | 
		
			
				  (Separately) Posted: Wed May 04, 2005 11:40    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				DjDf
 
Есть ещё один вариант: установить архиваторный плагин CopyLinkTarget и выполнять просто распаковку всех этих ярлыков в нужное место. ИМХО, достаточно удобный вариант. | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		DjDf
 
 
  Joined: 03 May 2005 Posts: 24
 
  | 
		
			
				  (Separately) Posted: Wed May 04, 2005 16:35    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				| Еще раз большое спасибо за советы. Мне все же больше всего понравился вариант решения Batya, но в NTFS Links насторожило то, что в результате при попытке удаления символической ссылки Проводником будет удалено всё содержимое оригинального каталога. Ну да ладно, моя проблема решена и без символических ссылок. =) | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		Batya
 
  
  Joined: 15 Dec 2004 Posts: 2229 Location: Москва, Россия
  | 
		
			
				  (Separately) Posted: Wed May 04, 2005 17:09    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				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 | 
		 | 
	 
	
		  | 
	 
	
		_Johm
 
 
  Joined: 14 May 2006 Posts: 119
 
  | 
		
			
				  (Separately) Posted: Wed Feb 03, 2010 07:48    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				| Как я понял, последний скрипт не работает с ярылками на папки? | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		MVV
 
  
  Joined: 15 Oct 2009 Posts: 4815 Location: Ростов-Дон
  | 
		
			
				  (Separately) Posted: Wed Feb 03, 2010 08:40    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Вообще, конечно, если ярлыки создаются только для временного хранения ссылок на файлы, то удобнее держать эти ссылки на временной панели. Но если ярлыки создаются по иной причине - самая банальная - доступ к ярлыкам извне ТК, то временные панели не помогут.
 
 
Попробовал я модуль CopyLinkTarget - в принципе вполне удобно. Можно выделить все ярлыки, нажать Alt+F9 - и ТК скопирует все файлы, на которые указывают ярлыки. Мне кажется, это удобнее, чем использовать скрипты. Но с ярлыками на папки он тоже не работает, но это не очень простая задача - отображать при входе в архив содержимое некоторой папки (мне приходилось такое реализовывать).
 
 
 	  | _Johm wrote: | 	 		  | Как я понял, последний скрипт не работает с ярылками на папки? | 	  
 
Судя по тому, что написано в скрипте - не работает. Если ярлыком пользуешься только из ТК, можно просто добавить ссылку на папку в Virtual Panel - тогда можно будет входить в папку по ссылке и видеть ее реальное содержимое и копировать куда нужно.
 
 
В принципе, несложно было бы написать скрипт (даже на основании указанного), который проверял бы, файлом или папкой является целевой объект ярлыка, и в зависимости от этого выполнял бы копирование файла или папки. Но это не по мне. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
 
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		_Johm
 
 
  Joined: 14 May 2006 Posts: 119
 
  | 
		
			
				  (Separately) Posted: Thu Feb 04, 2010 09:32    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				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 | 
		 | 
	 
	
		  | 
	 
	
		_Johm
 
 
  Joined: 14 May 2006 Posts: 119
 
  | 
		
			
				  (Separately) Posted: Thu Feb 04, 2010 12:31    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Куда воткнуть ECHO OFF. в код или в кнопку, чтобы в консоли
 
не было команд? | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		Batya
 
  
  Joined: 15 Dec 2004 Posts: 2229 Location: Москва, Россия
  | 
		
			
				  (Separately) Posted: Fri Feb 05, 2010 02:25    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | _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 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
	
  
	 
	    
	   | 
	
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 
 
		 |