我已经找到了解决问题的方法,但这很奇怪,我无法弄清楚它出错的地方。
我有一个看似非常简单的批处理文件。在具有两个文件的目录中,应该删除一个文件,复制另一个文件,然后将其重命名为刚刚删除的文件的名称。除了重命名之外,一切似乎都能正常工作。几乎看起来脚本运行了两次,但我找不到任何实际的证据。请参阅以下内容:
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%
如果我手动运行,它似乎工作正常。但是,当我从一个Scheduled Task中调用它时,它似乎运行了两次...也就是说,它删除了filename.csv,将文件名_ * .csv复制到正确的位置,但似乎删除了第二个文件而不是重命名它。
正如我所说,我真的不清楚实际做了什么。我已经尝试将结果记录在输出文件中,但内部没有任何帮助。
任何人都能看到我错过的东西吗?
提前致谢。
答案 0 :(得分:1)
检查
IF EXIST %filepath%%curFile% COPY /y %filepath%%curFile% %filepath%%Archive
请注意archive
似乎有一个前导%
- 这是一个目录" archive"或archive
设置为您未向我们展示的内容,因此应为...%filepath%%Archive%
(?missing / stray %
)的结果是,如果该目录已存在,该文件将被复制到名为archive
的文件或名为archive
的目录中。
就个人而言,我使用
SET "filepath=\\server-name\directory with a space"
其中引号分隔要分配的字符串(因此没有为变量分配杂散尾随空格),然后使用"%var1%\%var2%"来构造源/目标名称。这样可以确保不会出现双重"
并且目录很明显(但这是一种风格问题)。
答案 1 :(得分: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%")
答案 2 :(得分:0)
我终于找到了解决方法。事实证明,在我们的新环境已迁移的旧服务器上运行的任务副本。它与新服务器上运行的时间完全相同,这就是为什么在任务设置运行之前或之后尝试运行它的任何方式都可以完全运行。禁用旧版本的任务解决了这个问题。
感谢那些就我的命令提供反馈和建议的人!