2013-02-18 51 views
0

我無法僅使用dos命令複製和重命名文件。我有一個格式爲myfile20130218的文件,並且要將其複製並重命名爲some_other_file_20130218使用Dos命令複製文件並將文件名保留爲

我知道我可以使用copy source dest但我在如何隔離日期並保留它時遇到問題。我無法保證他的日期將成爲今天的日期,因此排除,源文件將永遠是相同的名稱。

我可以運行一系列命令或批處理腳本,但目前遇到麻煩的事情是在我找到需要複製的匹配項之後,我使用myfile????????,現在該如何獲取這些文件取消日期的名稱?

編輯:澄清我將在一個已知的目錄中查看文件,如上所述,我將知道文件名的格式,並且只會檢查它的特定目錄。檢查目錄的過程是一個ConnectDirect文件觀察器,所以當找到一個匹配myfile20130218的文件時,我可以啓動一些命令,但不知道如何檢查目錄並獲取存在文件的名稱。

+0

Powershell不是一個選項?我認爲這很難使用標準的Windows命令行工具。 – Jason 2013-02-18 00:05:15

+0

不,我忘了提到的一件事是,它必須從ConnectDirect腳本運行,所以基本上這個過程會在檢測到目錄中的匹配文件名時觸發。 – 2013-02-18 00:06:33

回答

2

像這樣的東西應該工作:

%oldname:~-8%提取從%oldname%最後8個字符然後將其附加到新的文件名。

更新:如果你可以用一個外部程序來識別該文件,然後調用的文件名的批處理腳本

copyfile.cmd C:\path\to\myfile20130218 

你可以做這樣的事情:

set oldname=%~nx1 
set newname=%~dp1some_other_file_%oldname:~-8% 
copy "%~f1" "%newname%" 

更新2:如果您知道文件夾和格式,您可以使用文件夾

copyfile.cmd C:\folder 

,做這樣的事情:

@echo off 

setlocal EnableDelayedExpansion 

for /f %%f in (
    'dir /b "%~f1" ^| findstr /r "myfile[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$"' 
) do (
    set oldname=%~f1\%%f 
    set newname=%~f1\my_other_name_!oldname:~-8! 
    copy "!oldname!" "!newname!" 
) 

endlocal 

編輯:腳本擊穿。

  • setlocal EnableDelayedExpansion在循環和條件中啓用可變擴展。
  • for /f %%f in ('...')在單引號之間執行命令,然後遍歷該命令的輸出。
  • dir /b "%~f1"以簡單模式(無標題,無摘要)列出給定目錄的內容(%~f1展開爲傳遞給腳本的第一個參數的完整路徑)。
  • findstr /r "myfile[0-9]...[0-9]$"過濾以子字符串「myfile」後跟8位數字結尾的字符串的輸入。管道(^|)之前的迴音消除了管道,因爲否則它將優先於for命令,該命令將有效地將for命令拆分爲一半,從而導致無效的命令行。
  • set oldname=%~f1\%%f將匹配文件的完整路徑分配給變量oldname
  • set newname=%~f1\my_other_name_!oldname:~-8!將變量newname指定爲新文件名(「my_other_name_」,後面跟着從後面8位數字從oldname)的完整路徑。
  • copy "!oldname!" "!newname!"我不需要解釋這個,對嗎?
+0

這就是我想要的,但我的問題是如何使這個通用的,以便我可以'myfile20130218',而不必直接指定如上? – 2013-02-18 01:02:34

+1

@dann你必須在某處指定它,無論是作爲參數,文件的內容或任何其他方式來做到這一點。所以,如果你指定了如何得到文件名,我肯定有人會編輯它或者提出一個新的問題。 – 2013-02-18 06:21:39

+0

@ dann.dev你到底在找什麼?以字符串「myfile」開頭並跟隨8位數字的文件?你知道文件的位置嗎?請儘可能具體。 – 2013-02-18 10:31:30

相關問題