さて、私だけが尋ねたタスクの場合、おそらく最良の解決策は、 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
1 つのファイルだけをコピーするときにファイルまたはディレクトリのプロンプトが表示されます。
質問に関係のない他のパラメーターは次のとおりです。
/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
な非典型的なファイルを含む任意のファイルで動作する必要があります。.htaccess
Windows コマンド プロセッサは、最後のポイントの後のすべてがファイルの拡張子であり、最後のポイントの前のすべてがファイル名であるという規則により、このようなファイルをファイル名のないファイル拡張子のみを持つファイルとして解釈します。
完全なタスクの説明と、完全にコメントされた最終的な解決策については、UltraEdit フォーラムの投稿「ファイルのバックアップ コピーを作成する」を参照してください。
Patrick、 Tirtha R、Interociter OperatorおよびCharlesB のソリューションは機能/Y
しません。これは、目的のファイルがまだ存在しない場合、使用してもファイルまたはディレクトリのプロンプトが回避されないためです。
Andy Morrisとgrenix のソリューションは、単一ファイルのコピー タスクには使用できません。宛先は、宛先ディレクトリの名前ではなく、宛先ファイルの名前でなければならないからです。宛先ディレクトリはソース ディレクトリと同じですが、宛先ファイルの名前はソース ファイルの名前とは異なります。
DosManとGovert のソリューションは、ポイントで始まり、ファイル拡張子を持たないファイルに対しては機能しません。
たとえば、コマンド
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 の記事も読む必要があります。