2010-11-26 145 views
57

我有一個簡單的複製,從腳本爲誰是從我的辦公桌上缺少一個文件20公里我們的球員之一批處理文件要求提供的文件或文件夾

測試腳本時出提示我,如果我的文件shapes.atc是文件或文件夾

我可以告訴你,它的一個文件,但我怎麼能自動複製它在我的傢伙需要能夠只需點擊該批次完成

xcopy /s/y J:\"My Name"\"FILES IN TRANSIT"\JOHN20101126\"Missing file"\Shapes.atc C:\"Documents and Settings"\"His name"\"Application Data"\Autodesk\"AutoCAD 2010"\"R18.0"\enu\Support\Shapes.atc 
+1

使用管道命令 – 2016-03-12 10:52:51

回答

10
echo f | xcopy /s/y J:\"My Name"\"FILES IN TRANSIT"\JOHN20101126\"Missing file"\Shapes.atc C:\"Documents and Settings"\"His name"\"Application Data"\Autodesk\"AutoCAD 2010"\"R18.0"\enu\Support\Shapes.atc 
+0

我有一個類似的問題涉及.zip文件,而不是.atc,這是在這裏發佈的3實際工作的唯一答案。 – 2012-07-23 15:44:44

+2

此解決方案可能無法在某些Windows本地化上運行。或者,您可以將星號附加到目標文件名,並且xcopy不會詢問任何內容。在這裏稍微詳細一點:http://stackoverflow.com/a/14022309/532647。 – 2013-01-29 12:00:46

+1

雖然這在本地化上打破了,但它是使用管道的一個很好的例子。 – 2015-05-20 21:44:23

17

實際上XCOPY不不問你原始文件是否存在,但是如果你想把它放在一個名爲Shapes.atc的新文件夾中,或者在Support文件夾中(這是你想要的。

爲了防止XCOPY從問這個,只是告訴他的目標文件夾,所以沒有歧義:

xcopy /s/y "J:\Old path\Shapes.atc" "C:\Documents and Settings\his name\Support" 

如果你想改變目標文件名只使用拷貝(這是比XCOPY時更適應複製文件):

copy /y "J:\Old path\Shapes.atc" "C:\Documents and Settings\his name\Support\Shapes-new.atc 
+1

對於`copy`而不是`xcopy`建議:) – 2013-12-24 16:26:34

+9

但是`copy`當然不會創建路徑,如果它不存在的話。 – 2014-04-29 13:28:00

3

/i開關可能是你之後的東西。

從xcopy /?

/I如果目標不存在並複製多個文件,則 假定目標必須是目錄。

151

一個看似無證竅門是把一個*目的地結束 - 那麼xcopy將複製的文件,像這樣

xcopy c:\source\file.txt c:\destination\newfile.txt* 

echo f | xcopy ...招不上的Windows,其中的本地化版本工作提示是不同的。

0
xcopy /s/y J:\"My Name"\"FILES IN TRANSIT"\JOHN20101126\"Missing file"\Shapes.atc C:\"Documents and Settings"\"His name"\"Application Data"\Autodesk\"AutoCAD 2010"\"R18.0"\enu\Support\*.*" 

..應該這樣做。

好主意,做一個:

IF NOT EXIST "C:\Documents and Settings\His name\Application Data\Autodesk\AutoCAD 2010\R18.0\enu\Support\Shapes.atc" ECHO/ && ECHO/ && ECHO * * * * * COPY FAILED - Call JustME at 555-555-1212 && ECHO/ && pause 

(假設你已經做了以前的版本命名爲.old)

XCOPY /Z <----- restartable mode - good for large files. 
0

虛擬母招

假設你有你的源文件和目標文件在

%SRC_FILENAME% and %DST_FILENAME% 

你可以使用2步法:

@REM on my win 7 system mkdir creates all parent directories also 
mkdir "%DST_FILENAME%\.." 
xcopy "%SRC_FILENAME% "%DST_FILENAME%\.." 

這將被解析爲例如

mkdir "c:\destination\b\c\file.txt\.." 
@REM The special trick here is that mkdir can create the parent 
@REM directory of a "virtual" directory (c:\destination\b\c\file.txt\) that 
@REM doesn't even need to exist. 
@REM So the directory "c:\destination\b\c" is created here. 
@REM mkdir "c:\destination\b\c\dummystring\.." would have the same effect 

xcopy "c:\source\b\c\file.txt" "c:\destination\b\c\file.txt\.." 
@REM xcopy computes the real location of "c:\destination\b\c\file.txt\.." 
@REM which is the now existing directory "c:\destination\b\c" 
@REM (the parent directory of the "virtual" directory c:\destination\b\c\file.txt\). 

我來到這個想法時,我絆了一些非常瘋狂../..-在構建過程中生成的命令行中構造。

2

當新擴展縮短時,可以使附加「*」的技巧工作。您需要用空白填充新的擴展名,這隻能通過將目標文件名用引號引起來完成。例如:

xcopy foo.shtml "foo.html *" 

這將複製並重命名而不提示。

「這不是一個錯誤,它是一個功能!」 (我曾在微軟的停車場裏看到一輛VW甲殼蟲,配備了「FEATURE」)。這些重命名的語義一直回到我寫DOS v.1的時候。除非在新名稱中出現通配符(?或*),否則新名稱中的字符會逐個替換舊名稱中的字符。不添加空白到新名稱,其餘字符將從舊名稱複製。

7

真正的技巧是:在要複製文件的目標路徑的末尾使用反斜槓。/Y用於覆蓋現有文件,如果不需要警告。

例子:

xcopy /Y "C:\file\from\here.txt" "C:\file\to\here\" 
1

嗯,如要求通過just me的也許是最好的解決辦法根據Andy Morris不完整的意見是以下命令的任務:

xcopy "J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file\Shapes.atc" "C:\Documents and Settings\His name\Application Data\Autodesk\AutoCAD 2010\R18.0\enu\Support\" /Q /R /S /Y 

該作品對於這個簡單的文件複製任務,因爲

  • 僅指定目標目錄,而不是目標文件和
  • 結束目的地目錄用反斜槓是另有XCOPY非常重要甚至會與/I提示有關複製文件或目錄只是一個單一的文件。

不相關的問題,其他參數是:

  • /Q ......安靜
  • /Y ...上覆蓋現有文件
  • /R是(OS語言無關)..覆蓋也是隻讀,隱藏和系統文件
  • /S ...從指定的目錄和所有子目錄。

好了,我不知道是否真的需要在這裏/S,因爲它是不明的,如果只是J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file\Shapes.atc應該被複制或在J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file目錄樹中的任何地方發現的所有Shapes.atc

可以通過打開命令提示符窗口並從該窗口內運行xcopy /?來獲取參數解釋,以獲得輸出XCOPY的幫助。


但沒有提供的解決方案的工作了上一個文件應該被複制到同一個目錄中的源文件中的文件複製任務,但由於當前日期和時間的不同的文件名中插入文件文件擴展名前的名稱。

源文件可以隱藏或設置系統屬性,但不包括使用COPY命令。

用於創建加時間戳文件的批處理文件也應該在Windows XP上工作,該文件不包括ROBOCOPY,因爲默認情況下在Windows XP上不可用。

批處理文件應該可以處理任何文件,包括非典型文件,如.gitconfig.htaccess,它們是沒有文件擴展名的文件,以點開頭,將它們隱藏在* nix系統上。 Windows命令處理器將這些文件解釋爲沒有文件名且僅具有文件擴展名的文件,因爲規則是上一點之後的所有內容都是文件的擴展名,而最後一點之前的所有內容都是文件名。

欲瞭解完整的任務描述和最終完整評論的解決方案,請參閱UltraEdit論壇中的文章Create a backup copy of files

Patrick'sTirtha R'sInterociter Operator'sCharlesB's解決方案不起作用,因爲使用/Y不避文件或目錄的提示,如果目標文件不存在。

Andy Morris'grenix's解決方案不能用於單個文件複製任務,因爲目標必須是目標文件的名稱而不是目標目錄的名稱。目標目錄與源目錄相同,但目標文件的名稱與源文件的名稱不同。

DosMan'sGovert's解決方案不適用於以點開始且沒有文件擴展名的文件。

例如命令

xcopy C:\Temp\.gitconfig C:\Temp\.gitconfig_2016-03-07_15-30-00* /C /H /K /Q /R /V /Y 

導致下面的錯誤消息上執行:

英文:無法擴大第二文件名,以便第一匹配。
德語:Zweiter Dateiname konnte nicht so erweitert werden,dass er zum ersten passt。

最後Denis Ivin's解決方案有一個限制,即操作系統語言相關字符用於自動應答文件或目錄提示必須知道。

所以我想到的方法來自動獲取F文件在英語Windows或DDatei上德語Windows或?爲... ...上的Windows。

確實可以確定自動回答提示的語言相關字符。

黑客攻擊被用來從提示文本依賴於語言的信件並沒有真正複製任何文件。

命令XCOPY用於開始將批處理文件自身複製到臨時文件的文件夾,文件擴展名爲目標文件的TMP。這導致提示符XCOPY如果沒有已經在臨時文件夾這個名字,這是非常不可能的文件。

NULL被用作輸入處理程序爲XCOPY導致提示後突破複製處理裝置的處理程序是通過XCOPY兩次輸出。

該輸出在FOR循環中處理,該循環從第一行開始以圓括號開始。這是第二個字符定義用於指定目標是文件的字母的行。

下面是使用XCOPY的代碼以確定該文件或目錄提示的自動應答,以創建在同一目錄中的單個文件的時間標記的副本作爲源文件,即使所需的字母的批處理文件源文件是隱藏文件或系統文件,即使源文件以點開頭並且沒有文件擴展名。

@echo off 
rem Batch file must be started or called with name of a single file. 

if "%~1" == "" exit /B 
for /F "delims=*?" %%I in ("#%~1#") do if not "%%I" == "#%~1#" exit /B 
if not exist "%~1" exit /B 
if exist "%~1\" exit /B 
setlocal EnableDelayedExpansion 

rem Determine the character needed for answering prompt of 
rem XCOPY for destination being a file and not a directory. 

del /F "%TEMP%\%~n0.tmp" 2>nul 
for /F %%I in ('%SystemRoot%\System32\xcopy.exe "%~f0" "%TEMP%\%~n0.tmp" ^<nul') do (
    set "PromptAnswer=%%I" 
    if "!PromptAnswer:~0,1!" == "(" (
     set "PromptAnswer=!PromptAnswer:~1,1!" 
     goto CopyFile 
    ) 
) 
echo ERROR: Failed to determine letter for answering prompt of XCOPY. 
exit /B 

:CopyFile 
rem This is a workaround for files starting with a point and having no 
rem file extension like many hidden files on *nix copied to Windows. 

if "%~n1" == "" (
    set "FileNameWithPath=%~dpx1" 
    set "FileExtension=" 
) else (
    set "FileNameWithPath=%~dpn1" 
    set "FileExtension=%~x1" 
) 

rem Get local date and time in region and language independent format YYYYMMDDHHmmss 
rem and reformat the local date and time to format YYYY-MM-DD_HH-mm-ss. 

for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS get LocalDateTime /format:value') do set "LocalDateTime=%%I" 
set "LocalDateTime=%LocalDateTime:~0,4%-%LocalDateTime:~4,2%-%LocalDateTime:~6,2%_%LocalDateTime:~8,2%-%LocalDateTime:~10,2%-%LocalDateTime:~12,2%" 

rem Do the copy with showing what is copied and with printing success or 
rem an error message if copying fails for example on sharing violation. 

echo Copy "%~f1" to "%FileNameWithPath%_%LocalDateTime%%FileExtension%" 

for /F %%I in ('echo %PromptAnswer% ^| %SystemRoot%\System32\xcopy.exe "%~f1" "%FileNameWithPath%_%LocalDateTime%%FileExtension%" /C /H /K /Q /R /V /Y') do set "FilesCopied=%%I" 

if "%FilesCopied%" == "1" (
    echo Success 
) else (
    echo ERROR: Copying failed, see error message above. 
) 

此批處理代碼在德語Windows XP SP3 x86和英語Windows 7 SP1 x64上進行了測試。

見在UltraEdit論壇帖子Create a backup copy of files一個類似的,完全註釋的批處理文件,說明該批次代碼的所有部分。

爲了解所使用的命令及其工作方式,請打開命令提示符窗口,在其中執行以下命令,並仔細閱讀爲每個命令顯示的所有幫助頁面。

  • del /?
  • echo /?
  • exit /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?
  • wmic OS get /?
  • xcopy /?

而且微軟的文章關於Using command redirection operators應該讀了。

2

引用XCopy Force File

迫使文件,我們可以使用管道「回聲F |」

C:\Trash>xcopy 23.txt 24.txt 
Does 24.txt specify a file name 
or directory name on the target 
(F = file, D = directory)? 

C:\Trash>echo F | xcopy 23.txt 24.txt 
Does 24.txt specify a file name 
or directory name on the target 
(F = file, D = directory)? F 
C:23.txt 
1 File(s) copied 

對於迫使夾,我們可以使用/ i參數爲XCOPY或使用反斜槓()在目的地文件夾的結尾。

0

我有完全相同的問題,想要將文件複製到外部硬盤驅動器進行備份。 如果我想複製一個完整的文件夾,COPY很樂意創建目標文件夾並用所有文件填充它。 但是,我想每天覆制一次文件,並將今天的日期添加到文件中。 COPY非常樂意複製文件並將其重新命名爲新格式,但只要目標文件夾已存在即可。

我的複製命令是這樣的:

COPY C:\ SRCFOLDER \ MYFILE.doc d:\ DESTFOLDER \ MYFILE_YYYYMMDD.doc

你一樣,我四處尋找替代交換機或其它副本鍵入命令,但沒有真正的工作,就像我想要的那樣。 然後,我想通過在複製命令之前添加一個make目錄(MD或MKDIR)命令來拆分兩個不同的需求。

所以現在我有

MKDIR d:\ DESTFOLDER

COPY C:\ SRCFOLDER \ MYFILE.doc d:\ DESTFOLDER \ MYFILE_YYYYMMDD.doc

如果目標文件夾不存在,那麼它創建它。 如果目標文件夾確實存在,則會生成一條錯誤消息。但是,這不會停止批處理文件繼續執行復制命令。

錯誤消息說: 子目錄或文件d:\ DESTFOLDER已經存在

正如我所說,該錯誤信息不會停止批處理文件的工作,這是一個非常簡單的解決問題的辦法。

希望這可以幫助。

相關問題