Tập tin xcopy, đổi tên, triệt tiêu Có phải xxx chỉ định một tên tập tin


404

Điều này có vẻ khá đơn giản và có lẽ tôi chỉ nhìn vào cờ thích hợp , nhưng làm thế nào tôi, trong một lệnh, sao chép một tệp từ thư mục này sang thư mục khác và đổi tên nó trong thư mục đích? Đây là lệnh của tôi:

if exist "bin\development\whee.config.example"
  if not exist "TestConnectionExternal\bin\Debug\whee.config"
    xcopy "bin\development\whee.config.example"
          "TestConnectionExternal\bin\Debug\whee.config"

Nó nhắc tôi với những điều sau đây mỗi lần:

TestConnectionExternal \ bin \ Debug \ whee.config có chỉ định tên tệp hoặc tên thư mục trên đích (F = tệp, thư mục D =) không?

Tôi muốn ngăn chặn lời nhắc này; Câu trả lời là luôn F.


15
tiếng vang f | xcopy ...
Cyclion

downvote tại sao bạn thậm chí sử dụng xcopy nếu sao chép làm những gì bạn muốn
barlop

3
Miscrosoft : "tại sao làm cho một cái gì đó đơn giản khi bạn có thể làm cho nó thực sự gây nhầm lẫn cho người dùng của bạn?". Đây là lúc họ nên sao chép những gì đang được thực hiện trong thế giới Linux, xem xét cpkhông có b ** t để sao chép các tệp / thư mục xung quanh!
fduff


Tôi khuyên bạn nên đọc câu trả lời của mình trên tệp BATCH yêu cầu giải thích chi tiết về tệp hoặc thư mục khi lời nhắc được hiển thị và cách nó có thể được trả lời tự động bởi một tệp ngôn ngữ hệ điều hành độc lập.
Mofi

Câu trả lời:


217

Đừng sử dụng xcopy, copythay vào đó, nó không có vấn đề này.

xcopythường được sử dụng khi thực hiện các bản sao đệ quy của nhiều tệp / thư mục hoặc khi bạn cần các tính năng xác minh / nhắc nhở mà nó cung cấp. Đối với các bản sao tập tin duy nhất, copylệnh hoạt động tốt.


97
copysẽ không sao chép tệp nếu toàn bộ cấu trúc thư mục cho đích không tồn tại. xcopysẽ tự động tạo tất cả các thư mục cần thiết.
BQ.

41
Thật đáng kinh ngạc khi xcopy có thiếu sót này. Nếu nó chỉ đơn giản là có một tùy chọn cho các tệp như nó có cho các thư mục (/ I), thì điều này sẽ được giải quyết và xcopy có thể là một sự thay thế tuyệt vời cho việc sao chép. Thay vào đó, do khiếm khuyết này, bạn phải chọn bản sao cho những tình huống này.
lửa

35
Như những người khác đã chỉ ra, câu trả lời của @ Arnshea là câu trả lời đúng. Điều này là do a) hoàn cảnh cụ thể của OP về việc đã có cấu trúc thư mục tại chỗ không được đề cập trong câu hỏi và b) nó có giá trị hơn nhiều đối với những độc giả tương lai của câu hỏi này, những người sẽ đến đây để tìm câu trả lời liên quan xcopyvà không chỉ copy.
Mike Nakis

17
Câu trả lời của Well @ Amshea cũng là câu trả lời đúng vì câu hỏi dành riêng cho xcopy và câu trả lời này về cơ bản là "không sử dụng xcopy". Không thực sự trả lời câu hỏi về xcopy, phải không?
BrainSlugs83

9
Chỉ cần thêm một ngôi sao ở cuối đường dẫn cho mục tiêu. Nhìn vào câu trả lời dưới đây. stackoverflow.com/a/26034267/1231
Donny V.

638

tôi sử dụng

echo f | xcopy /f /y srcfile destfile

để có được xung quanh nó.


17
@Arnshea - cảm ơn! Thích nghi với bản sao thư mục im lặngecho d | xcopy srcdirectory destdirectory /S
Tiến sĩ ABT

8
+1 @Arnshea tôi phải mất một thời gian để hiểu chính xác những gì bạn đang làm ở đó và vì tôi đang làm việc trên một cửa sổ tiếng Đức cài đặt nó echo d | xcopy ...cho tôi. Bạn thật tài giỏi
Thomas

23
Anh ta mô phỏng câu trả lời của người dùng cho câu hỏi mà xcopy sẽ hỏi.
John Munsch

5
@Thomas Điều đó có nghĩa là một tệp bó sử dụng kỹ thuật này sẽ không thể di chuyển trên các địa phương khác nhau?
Max Nanasy

17
@MaxNanasy Tôi xác nhận rằng đây không phải là di động trên khắp các địa phương. Trong một thiết lập tiếng Đức, bạn chuyển vào D cho một tệp hoặc V cho một thư mục. :(
Matt

177

Một lựa chọn khác là sử dụng ký tự đại diện đích. Lưu ý rằng điều này chỉ hoạt động nếu tên tệp nguồn và đích sẽ giống nhau, vì vậy trong khi điều này không giải quyết được ví dụ cụ thể của OP, tôi nghĩ rằng nó đáng để chia sẻ.

Ví dụ:

xcopy /y "bin\development\whee.config.example" "TestConnectionExternal\bin\Debug\*" 

sẽ tạo một bản sao của tệp "whee.config.example" trong thư mục đích mà không cần nhắc tệp hoặc thư mục.

Cập nhật : Như được đề cập bởi @chapluck:

Bạn có thể thay đổi "* "thành "[newFileName].*". Nó vẫn tồn tại phần mở rộng tập tin nhưng cho phép đổi tên. Hoặc nhiều hacky: "[newFileName].[newExt]*"để thay đổi phần mở rộng


1
"Tiếng vang f |" Cách này rất tuyệt, nhưng điều này tránh được đầu ra thêm mà tôi thường tìm kiếm để tìm vấn đề ở nơi đầu tiên.
Richard Anthony Hein

6
@ Durden81 - như zippycoder chỉ ra, câu trả lời của họ không đổi tên tệp, đó là một yêu cầu của OP.
Polyfun

6
Để mở rộng câu trả lời, tôi sẽ thay đổi "*" thành "[newFileName]. *". Nó vẫn tồn tại phần mở rộng tập tin nhưng cho phép đổi tên. Hoặc hacky hơn: "[newFileName]. * [NewExt]" để thay đổi tiện ích mở rộng.
chapluck

Cảm ơn! Phần cập nhật là phần đã giải quyết vấn đề của tôi, trong đó tên tệp cần được thay đổi, trong khi vẫn giữ phần mở rộng và giả sử rằng đó là tệp. XCopy nên có cái này như một công tắc.
Stanislav

1
Làm việc cho tôi mà không có dấu hoa thị ở cuối, chỉ cần dấu gạch chéo ngược.
tivnet

91

Có một số loại tính năng không có giấy tờ trong XCOPY. bạn có thể dùng:

xcopy "bin \ Development \ whee.config.example" "c: \ mybackup \ TestConnectionExternal \ bin \ Debug \ whee.config *"

tôi đã thử nó ngay hôm nay :-)


4
Cảm ơn rất nhiều. Tôi đã thêm "*" vào cuối tệp đích và nó đã hoạt động .. :) +1 cho mánh khóe
Rahul Patel

2
Giải pháp tuyệt vời - sạch sẽ, thanh lịch, không sử dụng một lệnh khác, tương thích với các cờ xcopy hiện có, hoạt động hoàn hảo. Đây phải là câu trả lời bình chọn hàng đầu.
Brian Swift

7
Câu trả lời không chính xác, lệnh sẽ dẫn whee.config.exampleđến thư mục đích, vì whee.config*khớp whee.config.example.
Meow

2
Tôi vừa tạo một tệp b.txtxt, và sau đó tôi đã khởi chạy lệnh xcopy a.txt b.txt* /F /Yvà tệp a.txtđã được sao chép vào b.txt, như mong đợi. Trên hết, trong khi sử dụng các /F /Ycông tắc, bản sao thực tế được hiển thị trên màn hình, chính xác như mong đợi.
Dominique

1
@Meow: không, vì ký tự đại diện ở đích chứ không phải nguồn.
ienaxxx

74

Chỉ cần truy cập http://technet.microsoft.com/en-us/l Library / bb491035.aspx

Đây là những gì chính là "... Nếu Destination không chứa thư mục hiện có và không kết thúc bằng dấu gạch chéo ngược (), thông báo sau sẽ xuất hiện: ...

Điểm đến có chỉ định tên tệp hoặc tên thư mục trên đích (F = tệp, thư mục D =) không?

Bạn có thể chặn thông báo này bằng cách sử dụng tùy chọn dòng lệnh / i, khiến xcopy cho rằng đích là một thư mục nếu nguồn có nhiều hơn một tệp hoặc một thư mục.

Mất một lúc, nhưng tất cả chỉ là RTFM.


7
Đây phải là câu trả lời hàng đầu! Chỉ để thực sự rõ ràng cho người khác. Nếu bạn đang sao chép MỘT tệp từ nơi này sang nơi khác VÀ bạn muốn tạo cấu trúc thư mục đầy đủ, hãy sử dụng lệnh sau: xcopy / "C: \ Data \ Images \ 2013 \ 08 \ 12 \ 85e4a707-2672-481b-92fb -67ecff20c96b.jpg "" C: \ Dữ liệu mục tiêu \ Hình ảnh \ 2013 \ 08 \ 12 \ 85e4a707-2672-481b-92fb-67ecff20c96b.jpg \ ". Có, đặt dấu gạch chéo ngược ở cuối tên tệp!
adudley

4
Câu trả lời tốt, nhưng không giải quyết được vấn đề. Tôi đã thử xcopy hello.txt hello2 \. Không có lời nhắc. Bây giờ tôi thử xcopy hello.txt hello3 (không có dấu gạch chéo ngược). Nó nhắc tôi cho dù số phận là tập tin hay thư mục. Tôi cần một cách để bảo nó giả sử F hoặc D trong một tập lệnh.
RuntimeException

27
Đây là một câu trả lời rất kỳ lạ, đặc biệt là vì những câu trả lời, tiếng sáo "RTFM" không ích lợi, và những bình luận đưa ra những câu trả lời "phổ biến" ... vì nó không giải quyết được câu hỏi ban đầu! Câu hỏi ban đầu nói rõ ràng "sao chép một tập tin từ một thư mục sang một thư mục khác VÀ TẠO CNTT trong thư mục đích". Câu trả lời đã cố gắng ở trên dường như để giải quyết trường hợp sao chép tệp khác với tên tệp đích là tên CÙNG làm tệp nguồn. Cách giải quyết "lộn xộn" được đưa ra bởi @Arnshea là câu trả lời một bước duy nhất tôi thấy được đưa ra ở đây - do đó "mức độ phổ biến" của nó.
M.Bearden

3
Ông Bearden khá lịch sự, nhưng với số phiếu bầu lên, tôi cảm thấy cần phải liệt kê rõ ràng các vấn đề với câu trả lời này: 1) đoạn 1 dường như đưa ra giải pháp cho vấn đề của OP (đoạn 4 trên 5), không không làm việc, bởi vì OP là sao chép và đổi tên một tập tin , không một thư mục; 2) liên kết được đưa ra ở đầu câu trả lời không cung cấp giải pháp; 3) báo cáo kết quả các vấn đề chính nào không áp dụng đối với câu hỏi của OP; và 4) câu trả lời gây khó chịu, với tiếng hét trong đoạn 2 và những lời lăng mạ cuối cùng. Có lẽ anh ta nên đọc lại Câu hỏi.
GlennFromIowa

2
Tất cả câu trả lời được đưa ra ở đây là sao chép vào một thư mục, không sao chép vào đích tệp, có thể và không có giấy tờ, xem câu trả lời khác từ zippycoder, chapluck, LBushkin
pdem

27

Vì vậy, có một sửa chữa đơn giản cho việc này. Nó được thừa nhận là vụng về, nhưng nó hoạt động. xcopy sẽ không nhắc tìm hiểu xem đích đến là thư mục hay tệp NẾU tệp mới (tên tệp) đã tồn tại. Nếu bạn đặt trước lệnh xcopy của mình bằng một tiếng vang đơn giản cho tên tệp mới, nó sẽ ghi đè lên tệp trống. Thí dụ

echo.>newfile.txt
xcopy oldfile.txt newfile.txt /Y

6

Đây là từ câu trả lời của Bills.

Chỉ để thực sự rõ ràng cho người khác.

Nếu bạn đang sao chép MỘT tệp từ nơi này sang nơi khác bạn muốn tạo cấu trúc thư mục đầy đủ, hãy sử dụng lệnh sau:

xcopy "C:\Data\Images\2013\08\12\85e4a707-2672-481b-92fb-67ecff20c96b.jpg" "C:\Target Data\\Images\2013\08\12\85e4a707-2672-481b-92fb-67ecff20c96b.jpg\" 

Có, đặt dấu gạch chéo ngược ở cuối tên tệp và nó sẽ KHÔNG hỏi bạn nếu đó là tệp hoặc thư mục. Vì chỉ có MỘT tệp trong nguồn, nên nó sẽ cho rằng đó là tệp.


12
Cái này sai. Khi chạy "xcopy versionBase.txt asd \ versionBase.txt \" và thư mục asd không xuất hiện, tôi nhận được tệp asd \ versionBase.txt \ versionBase.txt.
Cristian Niculescu

1
Cũng như các câu trả lời khác trên trang này, bài đăng này không giải quyết câu hỏi ban đầu. Câu hỏi là làm thế nào để sao chép VÀ đổi tên (trong một bước) một tệp. Cũng như các câu trả lời rõ ràng lẫn lộn khác, bài này nói về cách sao chép tệp KHÔNG đổi tên.
M.Bearden

Chưa kể đến việc nó thực sự tạo ra một thư mục có tên đó chứ không phải thư mục. Kiểm tra nó và chạy một thư mục sau đó, và bạn sẽ thấy một cái gì đó như thế này: dir "C:\Target Data\\Images\2013\08\12" 09/25/2015 10:48 AM <DIR> 85e4a707-2672-481b-92fb-67ecff20c96b.jpg
GlennFromIowa

3

xcopy src dest /I

REM This assumes dest is a folder and will create it, if it doesnt exists


2

Tôi đã có một vấn đề tương tự và cả robocopy và xcopy đều không giúp được gì, vì tôi muốn loại bỏ các bình luận và sử dụng một tên tệp đích khác. tôi đã tìm thấy

type filename.txt > destfolder\destfilename.txt

làm việc theo yêu cầu của tôi.


2

Trở lại với câu hỏi ban đầu:

 xcopy "bin\development\whee.config.example" "TestConnectionExternal\bin\Debug\whee.config"

có thể được thực hiện với hai lệnh, ví dụ:

mkdir "c:\mybackup\TestConnectionExternal\bin\Debug\whee.config\.."
xcopy "bin\development\whee.config.example" "c:\mybackup\TestConnectionExternal\bin\Debug\whee.config\"

Chỉ cần thêm "\ .." vào đường dẫn của tệp đích, thư mục đích được tạo nếu nó chưa tồn tại. Trong trường hợp này

"c:\mybackup\TestConnectionExternal\bin\Debug\"

thư mục mẹ của thư mục không tồn tại

"c:\mybackup\TestConnectionExternal\bin\Debug\whee.config\.."

Ít nhất đối với WIN7 mkdir không quan tâm nếu thư mục

"c:\mybackup\TestConnectionExternal\bin\Debug\whee.config\"

thực sự tồn tại


Một sửa chữa thú vị nếu thư mục không tồn tại. Thật không may, dòng tiếp theo (trong thử nghiệm của tôi) vẫn nhắc người dùng.
GlennFromIowa

Bạn nói đúng là xcopy "bin \ Development \ whee.config.example" "c: \ mybackup \ TestConnectionExternal \ bin \ Debug \ whee.config \". Tôi đã sử dụng aproach của mình để sao chép các tập tin vào một thư mục có thể không tồn tại. Để đổi tên, có vẻ như dấu gạch chéo ngược phải được thêm vào cuối.
grenix

2

XCOPY với * ở cuối mục tiêu để sao chép tệp cho dù chúng có tồn tại hay không ở đích XCOPY với \ ở cuối mục tiêu để sao chép các thư mục và nội dung có tồn tại hay không ở đích

Hoặc

RoboForm SOURCE DEST FILE cho các tệp RoboForm SOURCE DEST cho các thư mục


1

Tôi đề nghị robocopythay vì copyhoặc xcopy. Được sử dụng như lệnh hoặc trong GUI trên máy khách hoặc máy chủ. Chịu được tạm dừng mạng và bạn có thể chọn bỏ qua các thuộc tính tệp khi sao chép bản sao theo thuộc tính tệp. Ồ, và nó hỗ trợ các máy đa lõi để các tệp được sao chép nhanh hơn nhiều so với "song song" với nhau thay vì tuần tự. robocopycó thể được tìm thấy trên MS TechNet.


2
Tôi sử dụng robocopy tất cả các thời gian. Tuy nhiên, đối với câu hỏi của người đăng bài này, nó sẽ không hoạt động, vì nó không thể đổi tên các tệp. Một điều mà trước đây tôi không biết là xcopy có công tắc / z, có khả năng chịu được tạm dừng mạng!
GlennFromIowa

1

Điều đúng đắn nếu bạn muốn sao chép chỉ tập tin và thay đổi tên của nó tại đích là:

xcopy / f / y "bin \ Development \ example.exe" "TestConnectionExternal \ bin \ Debug \ NewName.exe *"

Và nó hoạt động tốt


1

Để sao chép các tệp lớn, xopy với / J switch là một lựa chọn tốt. Trong trường hợp này, chỉ cần đặt một F cho tệp hoặc D cho thư mục. Ngoài ra, bạn có thể lưu công việc trong một mảng để tham khảo trong tương lai. Ví dụ:

$MyScriptBlock = {
    Param ($SOURCE, $DESTINATION) 
    'F' | XCOPY $SOURCE $DESTINATION /J/Y 
    #DESTINATION IS FILE, COPY WITHOUT PROMPT IN DIRECT BUFFER MODE
}
JOBS +=START-JOB -SCRIPTBLOCK $MyScriptBlock -ARGUMENTLIST $SOURCE,$DESTIBNATION
$JOBS | WAIT-JOB | REMOVE-JOB

Cảm ơn Chand với một chút sửa đổi: https://stackoverflow.com/users/3705330/fram


0

Sử dụng bản sao thay vì xcopy khi sao chép tệp.

ví dụ: sao chép "bin \ Development \ whee.config.example" "TestConnectionExternal \ bin \ Debug \ whee.config"


1
Tôi đang cố gắng sao chép một tập tin vào cùng một thư mục với một tên khác và xcopy không thể hoạt động. Tôi sử dụng copy /Y source destinationđể vượt qua xác nhận ghi đè.
SandRock

0

Vì bạn không thực sự thay đổi tên tệp, bạn có thể lấy tên tệp từ đích đến và sẽ không có câu hỏi nào.

xcopy bin\development\whee.config.example TestConnectionExternal\bin\Debug\  /Y

Cách tiếp cận này hoạt động tốt khi thư mục đích được đảm bảo tồn tại và khi nguồn có thể là một tệp hoặc thư mục.


1
@downvoters: Tại sao câu trả lời này có thể bị hạ cấp? Trong bối cảnh này, Debugthư mục có thể được đảm bảo tồn tại.
Jirka Hanika

4
Câu trả lời này cho biết "vì bạn không thực sự thay đổi tên tệp", trong khi câu hỏi ban đầu nói rõ ràng "sao chép một tệp từ thư mục này sang thư mục khác VÀ TẠO CNTT trong thư mục đích". Vì vậy, điều này dường như không liên quan đến chủ đề.
M.Bearden

0

Làm việc xung quanh, sử dụng ReName ... và đặt tên cho nó là Tên mật mã, sau đó đặt lại tên cho Tên chính xác của nó

C:

CD "C: \ Users \ Public \ Documents \ Trang web của tôi \ AngelFire ~ Zoe \"

XCopy / D / I / V / Y "C: \ Users \ Public \ Documents \ My Web Site \ HostGator ~ ZoeBeans \ cop.htm"

Ren "cop.htm" "christ-our-passover.htm"


0

xcopy sẽ cho phép bạn sao chép một tập tin vào một thư mục được chỉ định, nó sẽ không cho phép bạn xác định tên đích. Nếu bạn yêu cầu tên đích, chỉ cần đổi tên trước khi sao chép.

đổi tên "bin \ Development \ whee.config.example" whee.config

xcopy / R / Y "bin \ Development \ whee.config" "TestConnectionExternal \ bin \ Debug \"


Giả sử điều này sẽ hoạt động trong một môi trường cụ thể (nghĩa là chắc chắn sẽ không bao giờ là whee.config trong thư mục nguồn), để sao chép mã của OP, liệu có nên đổi tên thành tên gốc không? ren "bin\development\whee.config" whee.config.example
GlennFromIowa

0

Đặt dấu hoa thị (*) ở cuối đường dẫn đích để bỏ qua tranh chấp của D và F.

Thí dụ:

xcopy "compressionOutput.xml" "../../Execute ScScript / APIAutomation / L Thư viện / rerunlastfailsbuild.xml *"


0

Liệu xxxxxxxxxxxx có chỉ định tên tệp hoặc tên thư mục trên mục tiêu không

(F = file, D = directory)? D

if a File : (echo F)
if a Directory (echo D)

0

Tôi đã gặp vấn đề tương tự khi cố gắng sao chép tệp với tên mới chỉ khi tệp không tồn tại ở đích hoặc tồn tại (với tên mới), nhưng cũ hơn. Giải pháp là thêm *char vào cuối tên tệp đích. Thí dụ:

xcopy "C:\src\whee.config.txt" "C:\dest\bee.config.txt*" /D /Y

Nó hoạt động như một bùa mê, thx
E.Big

-2

Bạn không thể chỉ định rằng nó luôn luôn là một tập tin. Nếu bạn không cần các tính năng khác của xcopy, tại sao không sử dụng thường xuyên copy?


5
Một lý do là copy, là một lệnh nội bộ, không đặt ErrorLevel. Nếu bạn muốn có thể ảnh hưởng đến đường dẫn của tệp bó nếu xảy ra lỗi sao chép, bạn cần sử dụng XCOPY.
rossmcm

2
Một lý do khác là nếu bạn muốn sử dụng các tính năng khác của xcopy, như / d
Victoria
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.