2010-09-14 85 views
3

我正在使用以下命令来复制文件。在NSIS中复制文件

设置输出路径后...

File "Documents\*" 

这个动作完美的作品。直到...

如果在目录中存在一个现有文件(具有不同名称)的副本,则只有该文件的第一个实例被复制,而不管名称如何。

我该怎么做才能复制所有文件,无论它们是否是其他文件的副本?

更正/更好的解释(也许)

我对这个混淆抱歉。请允许我尝试重述问题。通过使用FILE命令提取的文件是这里的问题。这些文件由原始文件和相同文件的副本组成(仅使用不同的名称)。

例如:MyDocument.txt和copyOfMyDocument.txt等..

当文件命令被施加,以便在文件被解压到当前输出路径,只有文件的第一个实例是提取(无论是复制或原始的......但不是两者)。再次,我很抱歉让人困惑,但这是我第一次不得不使用NSIS。我需要提取所有文件。

+0

你的问题没有任何意义,进一步混淆的东西,NSIS文件指令从yourinstaller.exe中提取文件,但NSIS也有一个命令称为CopyFiles,在最终用户系统上复制文件 – Anders 2010-09-16 15:25:36

+0

Anders先生,我补充说我认为是一个更好的解释。你怎么看? – 2010-09-20 21:32:52

+0

我也不明白你的问题,除非你的意思是你希望nsis为你重命名现有文件的副本,而不是重写。例如)如果MyDocument.txt存在将其重命名为MyDocument(1).txt,然后写它 – 2010-09-24 17:18:50

回答

2

最简单的方法是将它放在您创建的不同目录中。然后,如果您需要担心重命名(正如评论员注意到您的问题没有多大意义),则可以逐个文件地对其进行攻击。

# Extract the files to a directory which can't exist beforehand 
CreateDirectory $PLUGINSDIR\extracting 
SetOutPath $PLUGINSDIR\extracting 
File Documents\* 

# Now go through file by file 
FindFirst $0 $1 $OUTDIR\* 
${While} $1 != "" 
    ${If} ${FileExists} $DOCUMENTS\$1 
     # This still isn't infallible, of course. 
     Rename $DOCUMENTS\$1 $DOCUMENTS\$1.local-backup 
    ${EndIf} 
    Rename $OUTDIR\$1 $DOCUMENTS\$1 
    FindNext $0 $1 
${Loop} 
FindClose $0 
SetOutPath $INSTDIR # Or somewhere else 
RMDir $PLUGINSDIR\extracting 

(请注意,这是使用LogicLib。)

这不成了,虽然这样做的一个非常简洁的方式,如果你能避免它,这样做。

1

我以为我明白你在做什么之后,直到我开始阅读回复;我会按照我的初始解释去做:给一个名为“Documents”的目录,里面有一堆文件(他们叫什么,他们的内容应该不重要),你需要一个安装程序将文件复制到一些输出目录。我为这个场景创建了一个测试安装程序here,它适用于我。你在追求什么?