web-dev-qa-db-ja.com

BATCHファイルはファイルまたはフォルダーを要求します

私のデスクから20 km離れたファイルを紛失している人のスクリプトの簡単なコピーがあります

スクリプトをテストするときに、ファイル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
70
just me

文書化されていないように見えるトリックは、*宛先の最後-xcopyはファイルとしてコピーします。

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

echo f | xcopy ...トリックは、プロンプトが異なるWindowsのローカライズバージョンでは機能しません。

171
Govert

実際には、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
21
CharlesB
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
11
Denis Ivin

本当のトリックは、ファイルをコピーするターゲットパスの最後にバックスラッシュを使用することです。/Yは、警告が必要ない場合に既存のファイルを上書きするためのものです。

例:

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

参照 XCopy Force File

ファイルを強制するには、パイプライン "echo 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

フォルダーを強制するには、xcopyに/ iパラメーターを使用するか、宛先フォルダーの最後にbackslash()を使用します。

5
Shane Lu

さて、 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 ... yes(OS言語非依存)既存のファイルの上書き
  • /R ...読み取り専用、隠しファイル、システムファイルも上書き
  • /S ...指定したディレクトリおよびすべてのサブディレクトリから。

/Sだけをコピーする必要があるのか​​、J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file\Shapes.atcのディレクトリツリーのすべての場所でShapes.atcが見つかったのかが不明であるため、J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing fileが本当に必要かどうかはわかりません。

パラメーターの説明は、コマンドプロンプトウィンドウを開いてこのウィンドウ内から実行するとxcopy /?が表示され、[〜#〜] xcopy [〜#〜 ]


しかし、提供されたソリューションはいずれも、単一ファイルをソースファイルと同じディレクトリにコピーする必要があるファイルコピータスクでは機能しませんでしたが、ファイル拡張子の前のファイル名に現在の日付と時刻が挿入されるため、ファイル名が異なります。

ソースファイルには、[〜#〜] copy [〜#〜]コマンドの使用を除外する隠し属性またはシステム属性を設定できます。

タイムスタンプ付きファイルを作成するためのバッチファイルは、Windowsでも動作するはずですXP除外[〜#〜] robocopy [〜#〜]Windows XPではデフォルトで利用できないため。

バッチファイルは、* nixシステムで非表示にするポイントで始まるファイル拡張子のないファイルである.gitconfig.htaccessなどの一般的でないファイルを含むすべてのファイルで動作するはずです。 Windowsコマンドプロセッサは、このようなファイルを、ファイル名を持たず、ファイル拡張子のみを持つファイルとして解釈します。これは、最後のポイントの後はすべてファイルの拡張子であり、最後のポイントより前はすべてファイル名であるという規則のためです.

完全なタスクの説明と最終的な完全にコメントされたソリューションについては、UltraEditフォーラムの投稿 ファイルのバックアップコピーを作成する を参照してください。

Patrick'sTirtha R'sInterociter Operator's および CharlesB's ソリューションは、/Yを使用しないため機能しない宛先ファイルがまだ存在しない場合は、ファイルまたはディレクトリのプロンプトを避けます。

Andy Morris ' および grenix's 宛先は宛先ディレクトリの名前ではなく宛先ファイルの名前でなければならないため、ソリューションは単一ファイルのコピータスクに使用できません。宛先ディレクトリはソースディレクトリと同じですが、宛先ファイルの名前はソースファイルの名前と異なります。

DosMan's および Govert's ソリューションは、ポイントで始まりファイル拡張子を持たないファイルでは機能しません。

たとえば、コマンド

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

実行時に次のエラーメッセージが表示されます。

英語:second最初に一致するように2番目のファイル名を展開できませんでした。
ドイツ語:Zweiter Dateiname konnte nicht so erweitert werden、dass er zum ersten passt。

そして最後に Denis Ivin's ソリューションには、ファイルの自動応答のためのオペレーティングシステム言語依存文字ORディレクトリプロンプトが既知でなければならないという制限があります。

だから、英語のWindowsでF forFileまたはD forドイツ語のWindowsではDateiまたは... Windowsでは...に自動的に?

そして、プロンプトの自動応答用の言語依存文字を決定することは確かに可能です。

ハックは、実際にファイルをコピーせずにプロンプ​​トテキストから言語依存の文字を取得するために使用されます。

コマンド[〜#〜] xcopy [〜#〜]は、ファイル拡張子がTMPである一時ファイルのフォルダーへのバッチファイル自体のコピーを開始するために使用されます。宛先ファイル。これにより、[〜#〜] xcopy [〜#〜]によるプロンプトが表示されます。一時ファイルフォルダーにその名前のファイルがまだない場合非常にまれです。

デバイスのハンドラー[〜#〜] nul [〜#〜][の入力ハンドラーとして使用されます〜#〜] xcopy [〜#〜][〜#〜] xcopy [〜#〜によってプロンプトが出力された後、コピープロセスが中断されます。 ]2回。

この出力は、[〜#〜] for [〜#〜]ループで処理され、開き括弧で始まる最初の行で終了します。これは、2番目の文字が宛先がファイルであることを指定するために使用する文字を定義する行です。

次に、[〜#〜] 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フォーラムの投稿 ファイルのバックアップコピーを作成する を参照してください。

使用するコマンドとその動作を理解するには、コマンドプロンプトウィンドウを開き、そこで次のコマンドを実行し、各コマンドについて表示されるすべてのヘルプページを注意深く読んでください。

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

さらに、 コマンドリダイレクト演算子の使用 に関するMicrosoftの記事も読む必要があります。

3
Mofi

/ iスイッチは、あなたの望み通りかもしれません。

Xcopy /?から

/ I宛先が存在せず、複数のファイルをコピーする場合、宛先はディレクトリである必要があると想定します。

3
Andy Morris

新しい拡張子が短い場合、「*」を追加するトリックを機能させることができます。新しい拡張子に空白を埋め込む必要があります。これは、宛先ファイル名を引用符で囲むことによってのみ実行できます。例えば:

xcopy foo.shtml "foo.html *"

これにより、プロンプトなしでコピーおよび名前変更が行われます。

「これはバグではなく、機能です!」 (Microsoftの駐車場でバニティプレート "FEATURE"のVW Beetleを見たことがあります。)これらの名前変更のセマンティクスは、DOS v.1を書いたときまでさかのぼります。新しい名前にワイルドカード文字(?または*)が存在しない限り、新しい名前の文字は古い名前の文字に1つずつ置き換えられます。新しい名前に空白を追加しないと、残りの文字は古い名前からコピーされます。

2
DosMan

バックアップの目的で外部ハードドライブにファイルをコピーする場合、まったく同じ問題が発生しました。完全なフォルダーをコピーしたい場合、COPYは宛先フォルダーを作成し、すべてのファイルを取り込むことで非常に満足しました。ただし、1日に1回ファイルをコピーして、今日の日付をファイルに追加したかったのです。コピーは、ファイルをコピーして新しい形式で名前を変更しましたが、目的のフォルダが既に存在する場合に限りました。

私のコピーコマンドは次のようになりました:

[〜#〜] copy [〜#〜] C:\ SRCFOLDER\MYFILE.doc D:\ DESTFOLDER\MYFILE_YYYYMMDD.doc

あなたのように、私は代替スイッチまたは他のコピータイプのコマンドを探しましたが、私が望んでいたように実際に機能するものはありませんでした。次に、copyコマンドの前にディレクトリ作成(MDまたはMKDIR)コマンドを追加するだけで、2つの異なる要件を分割することを考えました。

だから今私は持っています

[〜#〜] mkdir [〜#〜] D:\ DESTFOLDER

[〜#〜] copy [〜#〜] C:\ SRCFOLDER\MYFILE.doc D:\ DESTFOLDER\MYFILE_YYYYMMDD.doc

宛先フォルダーが存在しない場合は、作成されます。宛先フォルダが存在する場合、エラーメッセージが生成されます。しかし、これは、バッチファイルがコピーコマンドを続行するのを停止しません。

エラーメッセージ:サブディレクトリまたはファイルD:\ DESTFOLDERは既に存在します

私が言ったように、エラーメッセージはバッチファイルの動作を停止しません、それは問題に対する本当に簡単な修正です。

これが役立つことを願っています。

0
Chris Eaton

仮想親のトリック

あなたがあなたのソースファイルと宛先ファイルを持っていると仮定します

%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\).

ビルドプロセスから生成されたコマンドラインにある非常にワイルドな../..-constructsにつまずいたとき、私はそのアイデアに思いつきました。

0
grenix
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.