2017-12-27 881 views
0

我已经寻找了解决方案,但这很奇怪,我无法准确找出问题所在。批处理文件无法正常工作,除非我正在观看

我有一个批处理文件,看起来很简单。在有两个文件的目录中,它应该删除一个,复制另一个文件,然后将其重命名为刚刚删除的文件被命名的内容。除了重命名之外,一切都似乎正常工作。它几乎看起来脚本运行两次,但我找不到任何这方面的实际证据。请看下面:

SET filepath="\\server-name\directory with a space\" 
SET oldFile=filename.csv 
SET curFile=filename_*.csv 

REM ===Delete current filename.csv=== 
IF EXIST %filepath%%oldFile% DEL %filepath%%oldFile% 

REM ===Copy all versions of .csv files that begin with filename_ to the Archive folder=== 
IF EXIST %filepath%%curFile% COPY /y %filepath%%curFile% %filepath%%Archive 

REM ===Rename the .csv file beginning with filename_ to filename.csv=== 
IF EXIST %filepath%%curFile% RENAME %filepath%%curFile% %oldFile% 

如果我手动运行这个,它似乎工作正常。但是,当我让它从计划任务调用时,它似乎运行两次...也就是删除filename.csv,将文件名_ *。csv复制到正确的位置,但似乎删除了第二个文件而不是重命名它。

正如我所说,我真的不清楚正在做什么。我试着将结果记录在输出文件中,但内部没有任何帮助。

任何人都可以看到我失踪的任何东西吗?

在此先感谢。

+0

为了测试,插入'echo%filepath %% oldFile%' - 它输出'“\\ server-name \目录的空格\”filename.csv' - 可能不是你想要的。 Magoo的答案显示'set'的正确引用语法。 – zett42

+0

非常感谢zett42,lit和Magoo帮助引用标记位置和更好的实践。我觉得这很有帮助,即使最终它没有完全解决根本问题。 :) – Night1505

回答

0

我终于找到了解决方案。原来在旧的服务器上运行了一个任务的副本,这是我们的新环境从中迁移而来的。它与新服务器上的服务器运行的时间完全相同,这就是为什么在任务设置为运行之前或之后尝试运行它的任何方式都能够完美运行。禁用旧版本的任务解决了该问题。

非常感谢那些对我的命令提供反馈和建议的人!

1

检查

IF EXIST %filepath%%curFile% COPY /y %filepath%%curFile% %filepath%%Archive 

注意archive似乎有领先% - 那是不是意味着是一个目录“存档”或archive集的东西你不向我们展示,因此它应该是...%filepath%%Archive%

的后果(?缺少/杂散%)是该文件将被复制到一个名为archive文件或命名archive如果该目录已经存在的目录。

就个人而言,我会使用

SET "filepath=\\server-name\directory with a space" 

其中引号分隔该字符串被分配(因此没有杂散尾随空格被分配给变量),然后构造使用“%VAR1源/目的地名%\%var2%“,它确保不会出现双重",并且该目录很明显(但这是风格问题)。

+0

这是一个子文件夹。例如\\ server-name \目录中有一个空格\存档。 我看到你发现的流浪的'%'符号(好眼睛!),但它确实做了副本。看起来会发生的是它删除旧文件(如果存在),将当前文件复制到存档子文件夹,但是,然后,而不是重新命名它,似乎也将其从当前文件夹中删除。这是我如此困惑的一部分。 – Night1505

+0

好吧,它似乎对我的工作使用我的模拟你的情况。在'rename'之后的'filepath'目录中是否确实存在'oldfile'?也许在'if exists ... rename ...'行前后''dir filename * .csv'可能会提供一个线索?我尝试使用多个'filename _ *。csv'文件,这些文件产生了适当的“重复文件名或未找到”消息,但仍将'filename.csv'留在了居住地。你确定你不是简单地误解错误信息吗? – Magoo

+0

是的,当我离开它并让它从任务运行时,我最终没有filename.csv。例如: 比方说,我在前一天的“基础文件夹”文件夹中有'filename.csv'。所以oldFile是'\\ Server \ Base Folder \ filename.csv'。今天创建的新文件是'filename_2017.12.28.11.15.csv'。两者都在同一个文件夹中。 如果我让脚本自己运行,我在\\ Server \ Base Folder \ Archive中找到了'filename_2017.12.28.11.15.csv'文件,并且在基本文件夹中没有任何文件。然后,我可以从档案中复制文件,再次手动运行任务,并且运行完美。 – Night1505

1

这是引用路径的最佳做法。在这种情况下,涉及空间的地方,这是一个要求。从变量定义中省略引用并在使用变量时在需要时提供它们更容易。

SET filepath=\\server-name\sharename\directory with a space\ 
IF EXIST "%filepath%%oldFile%" DEL "%filepath%%oldFile%" 

以我的经验,最好是离开目录中的路径没有尾部的反斜杠结束。另外,UNC路径应该有一个共享名。

SET "filepath=\\server-name\sharename\directory with a space" 
IF EXIST "%filepath%\%oldFile%" (DEL "%filepath%\%oldFile%") 
相关问题