xcopy file, zmień nazwę, pomiń komunikat „Czy xxx określa nazwę pliku…”

404

Wydaje się to dość proste i może po prostu przeoczyłem odpowiednią flagę , ale jak w jednym poleceniu skopiowałbym plik z jednego katalogu do drugiego i zmieniłem jego nazwę w katalogu docelowym? Oto moje polecenie:

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"

Za każdym razem monituje mnie o:

Czy TestConnectionExternal \ bin \ Debug \ whee.config określa nazwę pliku lub nazwę katalogu docelowego (F = plik, D = katalog)?

Chcę ukryć ten monit; odpowiedź brzmi zawsze F.

Sarah Vessels
źródło
15
echo f | xcopy ...
Cyclion,
oceń, dlaczego używasz xcopy, jeśli kopiowanie robi to, co chcesz
barlop
3
Miscrosoft : „po co tworzyć coś prostego, skoro może sprawić, że będzie to mylące dla użytkowników?”. To jest czas, kiedy powinni po prostu skopiować to, co dzieje się w świecie Linuksa, nie szukaj cpb ** t kopiowania plików / katalogów!
fduff
Polecam przeczytać moją odpowiedź na temat pliku BATCH z pytaniem o plik lub folder szczegółowo wyjaśniającym, kiedy pojawi się monit i jak można na nie odpowiedzieć automatycznie przez system plików wsadowych niezależny od języka.
Mofi

Odpowiedzi:

217

Nie używaj xcopy, copyzamiast tego użyj , nie ma tego problemu.

xcopyjest zwykle używany podczas wykonywania rekurencyjnych kopii wielu plików / folderów lub gdy potrzebujesz funkcji weryfikacji / monitowania, które oferuje. W przypadku kopii pojedynczych plików copypolecenie działa dobrze.

LBushkin
źródło
97
copynie skopiuje pliku, jeśli cała struktura katalogu dla miejsca docelowego jeszcze nie istnieje. xcopyautomatycznie utworzy wszystkie potrzebne katalogi.
BQ.
41
To niesamowite, że xcopy ma to pominięcie. Gdyby po prostu miał taką opcję plików, jak ma to miejsce w przypadku katalogów (/ I), zostałby to rozwiązany, a xcopy może być świetnym zamiennikiem kopiowania. Zamiast tego, z powodu tej wady, musisz wybrać kopię dla tych sytuacji.
rocketmonkeys,
35
Jak już zauważyli inni, odpowiedź @ Arnshea jest poprawna. Wynika to z faktu, że a) szczególna okoliczność OP, że już ma strukturę katalogów, nie została wspomniana w pytaniu, oraz b) jest to o wiele bardziej cenne dla przyszłych czytelników tego pytania, którzy przybędą tutaj, szukając odpowiedzi dotyczącej, xcopya nie tylko copy.
Mike Nakis,
17
Cóż, odpowiedź @ Amshea jest również poprawna, ponieważ pytanie jest specyficzne dla xcopy, a ta odpowiedź jest w zasadzie „nie używaj xcopy”. Naprawdę tak naprawdę nie odpowiada na pytanie dotyczące xcopy, prawda?
BrainSlugs83
9
Po prostu dodaj gwiazdkę na końcu ścieżki dla celu. Spójrz na tę odpowiedź poniżej. stackoverflow.com/a/26034267/1231
Donny V.
638

używam

echo f | xcopy /f /y srcfile destfile

obejść to.

Shea
źródło
17
@Arnshea - dzięki! Przystosowano do cichego kopiowania kataloguecho d | xcopy srcdirectory destdirectory /S
dr ABT
8
+1 @ Arnshea zajęło mi trochę czasu, aby zrozumieć, co dokładnie tam robisz, a ponieważ pracuję nad niemiecką instalacją systemu Windows, jest to echo d | xcopy ...dla mnie. Jesteś genialny
Thomas
23
Symuluje odpowiedź użytkownika na pytanie zadane przez xcopy.
John Munsch,
5
@Thomas Czy to oznacza, że ​​plik wsadowy korzystający z tej techniki nie będzie przenośny w różnych lokalizacjach?
Max Nanasy,
17
@ MaxNanasy Potwierdziłem, że nie jest to przenośne między lokalizacjami. W niemieckiej konfiguracji przekazujesz D dla pliku lub V dla katalogu. :(
Matt
177

Inną opcją jest użycie docelowego symbolu wieloznacznego. Zauważ, że działa to tylko wtedy, gdy nazwy plików źródłowych i docelowych będą takie same, więc chociaż nie rozwiązuje to konkretnego przykładu OP, pomyślałem, że warto się nim podzielić.

Na przykład:

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

utworzy kopię pliku „whee.config.example” w katalogu docelowym bez pytania o plik lub katalog.

Aktualizacja : Jak wspomniano @chapluck:

Możesz zmienić "* "na "[newFileName].*". Nadal trwa rozszerzenie pliku, ale umożliwia zmianę nazwy. Lub bardziej hacky: "[newFileName].[newExt]*"zmienić rozszerzenie

zippycoder
źródło
1
„Echo f |” sposób jest fajny, ale pozwala to uniknąć dodatkowych wyników, których często szukam, aby znaleźć problemy.
Richard Anthony Hein
6
@ Durden81 - jak wskazuje zippycoder, ich odpowiedź nie zmienia nazwy pliku, co było wymaganiem OP.
Polyfun
6
Aby rozszerzyć odpowiedź, zmieniłbym „*” na „[newFileName]. *”. Nadal trwa rozszerzenie pliku, ale umożliwia zmianę nazwy. Lub bardziej hacky: „[newFileName]. * [NewExt]”, aby zmienić rozszerzenie.
chapluck
Dzięki! Sekcja aktualizacji rozwiązała mój problem, gdzie nazwa pliku musiała zostać zmieniona, zachowując rozszerzenie i zakładając, że jest to plik. XCopy powinien mieć to jako przełącznik.
Stanislav
1
Pracowałem dla mnie bez gwiazdki na końcu, tylko odwrotny ukośnik.
tivnet
91

W XCOPY jest jakaś nieudokumentowana funkcja. możesz użyć:

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

właśnie to przetestowałem. :-)

ienaxxx
źródło
4
Wielkie dzięki. Dodałem „*” na końcu pliku docelowego i zadziałało .. :) +1 za lewę
Rahul Patel
2
Doskonałe rozwiązanie - czyste, eleganckie, nie używa innej komendy, kompatybilne z istniejącymi flagami xcopy, działa bezbłędnie. To powinna być najczęściej głosowana odpowiedź.
Brian Swift,
7
Odpowiedź jest niepoprawna, polecenie spowoduje whee.config.exampleutworzenie folderu docelowego, ponieważ whee.config*pasuje whee.config.example.
Meow
2
Właśnie utworzyłem plik b.txtxt, a następnie uruchomiłem polecenie xcopy a.txt b.txt* /F /Yi plik a.txtzostał skopiowany b.txtzgodnie z oczekiwaniami. Ponadto podczas używania /F /Yprzełączników rzeczywista kopia jest wyświetlana na ekranie dokładnie zgodnie z oczekiwaniami.
Dominique
1
@Meow: nie, ponieważ symbol wieloznaczny znajduje się w miejscu docelowym, a nie źródle.
ienaxxx
74

Po prostu przejdź do http://technet.microsoft.com/en-us/library/bb491035.aspx

Oto GŁÓWNA PROBLEM: „Jeśli miejsce docelowe nie zawiera istniejącego katalogu i nie kończy się odwrotnym ukośnikiem (), pojawia się następujący komunikat: ...

Czy miejsce docelowe określa nazwę pliku lub nazwę katalogu docelowego (F = plik, D = katalog)?

Możesz ukryć ten komunikat, używając opcji wiersza polecenia / i, co powoduje, że xcopy przyjmuje, że miejscem docelowym jest katalog, jeśli źródłem jest więcej niż jeden plik lub katalog.

Zajęło mi to trochę czasu, ale wystarczy RTFM.

Rachunek
źródło
7
To powinna być najlepsza odpowiedź! Żeby być naprawdę jasne dla innych. Jeśli kopiujesz JEDEN plik z jednego miejsca do drugiego ORAZ chcesz utworzyć pełną strukturę katalogów, użyj następującego polecenia: xcopy / "C: \ Data \ Images \ 2013 \ 08 \ 12 \ 85e4a707-2672-481b-92fb -67ecff20c96b.jpg "" C: \ Dane docelowe \\ Images \ 2013 \ 08 \ 12 \ 85e4a707-2672-481b-92fb-67ecff20c96b.jpg \ ". Tak, umieść ukośnik odwrotny na końcu nazwy pliku!
adudley,
4
Dobra odpowiedź, ale nie rozwiązuje problemu. Próbowałem xcopy hello.txt hello2 \. Bez pytania. Teraz próbuję xcopy hello.txt hello3 (bez odwrotnego ukośnika). Pyta mnie, czy dest jest plikiem, czy reż. Potrzebuję sposobu, aby powiedzieć mu, aby zakładał F lub D w skrypcie.
RuntimeException
27
To bardzo dziwna odpowiedź, szczególnie z powodu głosów poparcia, niepomocnego snarka „RTFM” i komentarzy stawiających odpowiedzi „popularne” ... ponieważ nie odnosi się do pierwotnego pytania! W pierwotnym pytaniu było wyraźnie powiedziane: „Skopiuj plik z jednego katalogu do drugiego i ZMIEŃ NAZWĘ w katalogu docelowym”. Podana powyżej próba odpowiedzi wydaje się dotyczyć innego przypadku kopiowania pliku z nazwą pliku docelowego SAMĄ nazwą pliku źródłowego. „Nieuporządkowane” obejście podane przez @Arnshea jest jedyną możliwą odpowiedzią, jaką tu widzę - stąd jego „popularność”.
M.Bearden
3
Pan Bearden był dość uprzejmy, ale biorąc pod uwagę liczbę głosów, czuję potrzebę wyraźnego wyszczególnienia problemów z tą odpowiedzią: 1) akapit 1, który wydaje się stanowić rozwiązanie problemu PO (ust. 4 z 5), nie nie działa, bo PO jest kopiowanie i zmiana nazwy z pliku , a nie katalogu; 2) link podany na górze odpowiedzi nie zapewnia rozwiązania; 3) sprawozdanie z głównego problemu nie nie stosuje na pytanie OP; oraz 4) odpowiedź jest obraźliwa, z krzykiem w drugim akapicie i obelgami w ostatnim. Być może powinien był ponownie przeczytać pytanie.
GlennFromIowa
2
Wszystkie podane tutaj odpowiedzi to kopiowanie do katalogu, a nie kopiowanie do miejsca docelowego pliku, co jest możliwe i nieudokumentowane, patrz inna odpowiedź z zippycoder, chapluck, LBushkin
pdem
27

Istnieje więc prosta poprawka. To wprawdzie niezręczne, ale działa. xcopy nie wyświetli monitu o sprawdzenie, czy miejscem docelowym jest katalog lub plik, JEŻELI nowy plik (nazwa pliku) już istnieje. Jeśli poprzedzisz polecenie xcopy prostym echem nowej nazwy pliku, zastąpi on pusty plik. Przykład

echo.>newfile.txt
xcopy oldfile.txt newfile.txt /Y
DaveD
źródło
6

To jest odpowiedź Bills.

Żeby być naprawdę jasne dla innych.

Jeśli kopiujesz JEDEN plik z jednego miejsca do drugiego ORAZ chcesz utworzyć pełną strukturę katalogów, użyj następującego polecenia:

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\" 

Tak, umieść ukośnik odwrotny na końcu nazwy pliku i NIE zapyta Cię, czy jest to plik czy katalog. Ponieważ w źródle znajduje się JEDEN plik, zakłada się, że jest to plik.

adudley
źródło
12
To jest źle. Po uruchomieniu „xcopy versionBase.txt asd \ versionBase.txt \” i katalogu asd nie ma, otrzymuję plik asd \ versionBase.txt \ versionBase.txt.
Cristian Niculescu,
1
Podobnie jak w przypadku innych odpowiedzi na tej stronie, ten post nie odnosi się do pierwotnego pytania. Pytanie brzmiało, jak skopiować ORAZ zmienić nazwę (w jednym kroku) pliku. Podobnie jak w przypadku innych pozornie niejasnych odpowiedzi, w tym omówiono sposób kopiowania pliku BEZ zmiany nazwy.
M.Bearden
Nie wspominając już o tym, że tak naprawdę tworzy katalog o tej nazwie, a nie folder. Przetestuj to, a następnie uruchom reż, a zobaczysz coś takiego: 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

jerryh91
źródło
2

Miałem podobny problem i zarówno robocopy, jak i xcopy nie pomogły, ponieważ chciałem ukryć komentarze i użyć innej docelowej nazwy pliku. znalazłem

type filename.txt > destfolder\destfilename.txt

działa zgodnie z moimi wymaganiami.

użytkownik140185
źródło
2

Powrót do pierwotnego pytania:

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

można to zrobić za pomocą dwóch poleceń, np .:

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

Po prostu dodając „\ ..” do ścieżki pliku docelowego, tworzony jest katalog docelowy, jeśli jeszcze nie istnieje. W tym przypadku

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

który jest katalogiem nadrzędnym nieistniejącego katalogu

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

Przynajmniej dla WIN7 mkdir nie dba o to, czy katalog

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

naprawdę istnieje.

grenix
źródło
Ciekawa poprawka, jeśli katalog nie istnieje. Niestety, następny wiersz (w moich testach) wciąż podpowiada użytkownikowi.
GlennFromIowa
Masz rację, powinien być xcopy „bin \ development \ whee.config.example” „c: \ mybackup \ TestConnectionExternal \ bin \ Debug \ whee.config \”. Użyłem mojej metody kopiowania plików do katalogu, który może nie istnieć. Aby zmienić nazwę, na końcu należy dodać ukośnik odwrotny.
grenix
2

XCOPY z * na końcu celu, aby skopiować pliki, niezależnie od tego, czy istnieją w miejscu docelowym XCOPY z \ na końcu celu, aby skopiować foldery i zawartość, czy istnieją, czy nie

Alternatywnie

RoboForm SOURCE DEST FILE dla plików RoboForm SOURCE DEST FILE dla folderów

Colin Hay
źródło
1

Sugeruję robocopyzamiast copylub xcopy. Używany jako polecenie lub w GUI na klientach lub serwerach. Tolerancja na przerwy w sieci i możesz zignorować atrybuty pliku podczas kopiowania kopii według atrybutów pliku. Aha, i obsługuje maszyny wielordzeniowe, więc pliki są kopiowane znacznie szybciej „równolegle” ze sobą zamiast sekwencyjnie. robocopymożna znaleźć na MS TechNet.

surferdj
źródło
2
Cały czas używam robocopy. Jednak w przypadku pytania tego plakatu nie będzie działać, ponieważ nie może zmieniać nazw plików. Nie wiedziałem wcześniej, że xcopy ma przełącznik / z, który toleruje przerwy w sieci!
GlennFromIowa
1

Właściwe postępowanie, jeśli chcesz skopiować tylko plik i zmienić jego nazwę w miejscu docelowym, to:

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

I będzie dobrze

Thanos
źródło
1

Do kopiowania dużych plików dobrym wyborem jest xopy z przełącznikiem / J. W takim przypadku po prostu potokuj F dla pliku lub D dla katalogu. Możesz także zapisać zadania w tablicy do wykorzystania w przyszłości. Na przykład:

$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

Dzięki Chand z drobnymi modyfikacjami: https://stackoverflow.com/users/3705330/chand

MAZDA
źródło
0

Do kopiowania plików używaj kopiowania zamiast xcopy.

np. skopiuj „bin \ development \ whee.config.example” „TestConnectionExternal \ bin \ Debug \ whee.config”

Piotr
źródło
1
Próbuję skopiować plik do tego samego folderu o innej nazwie i xcopy nie może działać. Używam, copy /Y source destinationaby przekazać potwierdzenie nadpisania.
SandRock,
0

Ponieważ tak naprawdę nie zmieniasz nazwy pliku, możesz wyjąć nazwę pliku z miejsca docelowego i nie będzie żadnych pytań.

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

To podejście działa dobrze, gdy istnieje gwarancja, że ​​katalog docelowy istnieje i gdy źródłem może być równie plik lub katalog.

simmo
źródło
1
@downvoters: Dlaczego ta odpowiedź mogła zostać zanegowana? W tym kontekście Debugkatalog prawdopodobnie istnieje.
Jirka Hanika
4
Ta odpowiedź brzmi „skoro tak naprawdę nie zmieniasz nazwy pliku”, podczas gdy pierwotne pytanie wyraźnie brzmiało „skopiuj plik z jednego katalogu do drugiego i ZMIEŃ NAZWĘ w katalogu docelowym”. Wydaje się więc, że nie ma to znaczenia dla tematu.
M.Bearden,
0

Obejdź, użyj ReName ... i nadaj mu nazwę Cryptic Name, a następnie zmień nazwę na prawidłową nazwę

DO:

Płyta CD „C: \ Users \ Public \ Documents \ My Web Sites \ AngelFire ~ Zoe \”

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

Ren „cop.htm” „christ-our-passover.htm”

JollyChollie
źródło
0

xcopy pozwoli ci skopiować pojedynczy plik do określonego folderu, po prostu nie pozwoli ci zdefiniować nazwy docelowej. Jeśli potrzebujesz nazwy docelowej, po prostu zmień jej nazwę przed skopiowaniem.

ren „bin \ development \ whee.config.example” whee.config

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

Chuck Emanuel
źródło
Zakładając, że zadziałałoby to w określonym środowisku (tj. Na pewno nigdy nie będzie whee.config w folderze źródłowym), w celu zreplikowania kodu OP, czy nie powinno to obejmować zmiany nazwy z powrotem na pierwotną nazwę? ren "bin\development\whee.config" whee.config.example
GlennFromIowa
0

Umieść gwiazdkę (*) na końcu ścieżki docelowej, aby pominąć spór D i F.

Przykład:

xcopy "compressedOutput.xml" "../../Execute Scripts / APIAutomation / Libraries / rerunlastfailedbuild.xml *"

Iqra.
źródło
0

Czy xxxxxxxxxxxx określa nazwę pliku lub nazwę katalogu docelowego

(F = file, D = directory)? D

if a File : (echo F)
if a Directory (echo D)
Dania al khalil
źródło
0

Ten sam problem napotkałem, gdy próbowałem skopiować plik o nowej nazwie tylko wtedy, gdy plik nie istnieje w miejscu docelowym lub istnieje (z nową nazwą), ale jest starszy. Rozwiązaniem jest dodanie *znaku na końcu nazwy pliku docelowego. Przykład:

xcopy "C:\src\whee.config.txt" "C:\dest\bee.config.txt*" /D /Y
Iwan Aleksandrow
źródło
Działa jak urok, dzięki
E.Big
-2

Nie można określić, że zawsze jest to plik. Jeśli nie potrzebujesz innych funkcji xcopy, dlaczego po prostu nie używasz regularnie copy?

Gabe
źródło
5
Jednym z powodów jest to copy, że będąc wewnętrznym poleceniem, nie ustawia ErrorLevel. Jeśli chcesz mieć wpływ na ścieżkę pliku wsadowego, jeśli wystąpi błąd kopiowania, musisz użyć XCOPY.
rossmcm,
2
Innym powodem jest to, że chcesz użyć innych funkcji xcopy, takich jak / d
Victoria