2017-12-27 877 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%") 
相關問題