78

私のデスクから 20 km 離れた場所でファイルを紛失している従業員の 1 人のために、スクリプトの単純なコピーを用意しています。

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

11 に答える 11

187

一見文書化されていないトリックは*、宛先の最後に a を配置することです-その後、次xcopyのようにファイルとしてコピーされます

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

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

于 2013-01-23T20:09:59.650 に答える
22

実際には、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
于 2010-11-26T08:20:03.933 に答える
16

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

例:

xcopy /Y "C:\file\from\here.txt" "C:\file\to\here\"
于 2016-02-10T15:48:13.307 に答える
12
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
于 2010-11-26T08:15:42.550 に答える
3

さて、私だけが尋ねたタスクの場合、おそらく最良の解決策は、 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/I1 つのファイルだけをコピーするときにファイルまたはディレクトリのプロンプトが表示されます。

質問に関係のない他のパラメーターは次のとおりです。

  • /Q... 静かな
  • /Y... yes (OS 言語に依存しない) on overwrite existing file
  • /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

パラメーターの説明は、コマンド プロンプト ウィンドウを開き、このウィンドウ内から実行してXCOPYxcopy /?のヘルプを出力することで読むことができます。


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

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

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

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

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

Patrick、 Tirtha RInterociter OperatorおよびCharlesB のソリューションは機能/Yしません。これは、目的のファイルがまだ存在しない場合、使用してもファイルまたはディレクトリのプロンプトが回避されないためです。

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

DosManGovert のソリューションは、ポイントで始まり、ファイル拡張子を持たないファイルに対しては機能しません。

たとえば、コマンド

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

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

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

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

そこで、英語の Windows ではFileを、ドイツ語の Windows では Datei を、Windows では...自動的に取得Fする方法を考えました。D?

また、プロンプトの自動応答の言語依存文字を決定することも実際に可能です。

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

コマンド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 の記事も読む必要があります。

于 2016-03-06T15:53:33.520 に答える
3

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

xcopy から /?

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

于 2010-11-29T10:55:04.240 に答える
2

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

xcopy foo.shtml "foo.html *"

これにより、プロンプトが表示されずにコピーされ、名前が変更されます。

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

于 2016-01-18T20:11:58.297 に答える