2016-11-12 20 views
2

WindowsのCMD/BATを使用して、ソースファイルのABSOLUTEの場所がない場合、どのようにファイル(この場合は実行可能な/ .exeファイル)を新しい場所にコピーできますか?私はむしろCMDファイルとBATファイルを初めて使っています。CMD:パス名としてワイルドカードを使用して実行可能ファイルをコピーするにはどうすればよいですか?

指定されたファイル自体は、ユーザーの入力に依存します。したがって、そのファイルのパスはコード自体で指定されていません。

Ex。 MSpaint.exe(C:\ Windows \ System32にありますが、質問のコンテキストについてはわかりませんが)をPAINTというデスクトップフォルダにコピーします。

私は

copy "*\mspaint.exe" "C:\Users\User\Desktop\PAINT" 

を使用してみました。しかし、私はノーさらに無駄に、ワイルドカードパスなしでコマンドを使用してみました

The filename, directory name, or volume label syntax is incorrect. 
    0 files(s) copied. 

エラー声明は述べています。

copy "mspaint.exe" "C:\Users\User\Desktop\PAINT" 

ご協力いただければ幸いです。ここで

+0

の 'dir/sのC:\ filename.ext'は、ハードドライブを検索します。 '/ D %% A in( 'Dir/s c:\ filename.ext')Do Echo %% Aはコマンド出力で動作します。 –

+0

コマンドプロンプトウィンドウを開き、 '/?'、 'call /?'、 'set /?'を実行し、最後に 'set'を実行して3つのコマンドとWindowsでデフォルトで定義されている環境変数。コピーしようとするファイルが隠しディレクトリやシステムディレクトリにあるか、 '/ R ...のために'隠されたファイルやシステムファイルであるという点を除いて、Noodlesが提案するコマンド__DIR__は本当に必要ありません。例えば、現在のユーザのデスクトップフォルダは '"%USERPROFILE%\ Desktop "'で参照できます。 – Mofi

+0

実行可能なソースファイルがあなたのPATHにあれば、 'FOR/F'を使って見つけることができます。これは役に立ちます。 http://stackoverflow.com/questions/31575817/locate-file-and-copy-its-path-batch-script/31576863#31576863 PATHにない場合は、 'DIR/S 'ヌードルの示唆通り。しかし、プログラムがどこにあるのかを前提にしない限り、信頼できるとは言えません。 – lit

答えて

1

見つかったときにフルパスに展開されます。

Set "EXE=mspaint.exe" & set MyPath=.;%Path% 
for %%A in (%EXE%) do Set EXE=%%~$MyPath:A 
If defined EXE copy "%EXE%" "C:\Users\User\Desktop\PAINT" 
Cite from for /? 
%~$PATH:I - searches the directories listed in the PATH 
       environment variable and expands %I to the 
       fully qualified name of the first one found. 
       If the environment variable name is not 
       defined or the file is not found by the 
       search, then this modifier expands to the 
       empty string 
+0

これは完全に機能します。 FORループ内のプログラム名を変数に変更する方法はありますか? [FOR %% A in(%Variable%)do()]?私は 'for /?'に気付いた。それはワイルドカードが使用されることを言及します。 – Caspr

+0

@Casprは上記のバッチスニペットに応じて動作を変更しました – LotPings

0

は簡単な例バッチコードです:

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
set "FileToFind=" 
set /P "FileToFind=Please enter file name: " 
for /F %%I in ('dir "C:\!FileToFind!" /A-D /B /S 2^>nul') do (
    set "FilePath=%%~dpI" 
    goto FileFound 
) 
echo Could not find !FileToFind! on drive C: 
goto EndBatch 

:FileFound 
echo Found !FileToFind! in %FilePath% 

:EndBatch 
echo. 
endlocal 
pause 

このバッチコードは、それぞれ隠しまたはシステムファイルCドライブに隠したり、システムディレクトリ内のファイルを見つけることができます:。

隠しおよびシステムのディレクトリ/ファイルを無視して、代替ソリューションです:

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
set "FileToFind=" 
set /P "FileToFind=Please enter file name: " 
for /R "C:\" %%I in ("!FileToFind!*") do (
    set "FilePath=%%~dpI" 
    goto FileFound 
) 
echo Could not find !FileToFind! on drive C: 
goto EndBatch 

:FileFound 
echo Found !FileToFind! in %FilePath% 

:EndBatch 
echo. 
endlocal 
pause 

このソリューションはさらにtest.txtを入力の上、それはまたtest.txt.bakを見つけるだろうという欠点があります。

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

  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • pause /?
  • set /?
  • 編集はVARでexeファイルを置くように変更

    :Aはめったに;-) だからファイルを探してwhere.exe貧しいマンはどこかSearchPathの中でされている変数の拡張のために特別に使用されていない

+0

これを試してみました。私は "mspaint.exe"/"mspaint"と "test.txt"/"test"の両方をテストしました(testはこれをテストするために私のデスクトップ上に作成した空の.txtファイルです)、結果を受け取りませんでした。 @echoをオフにすると、FORループの最後にあるGOTOファイルの後にコードが一時停止することがわかります。コマンドプロンプトは止まったままで、入力を受け入れることも、コードを実行することもできません。なぜこれになるのか?ありがとう! – Caspr

+0

さて、このコードは単なる例に過ぎません。ファイル名が部分的に入力されたかどうか、つまりファイル拡張子がないか、または二重引用符を使用して削除する必要があるか、または削除する必要のあるパスを入力したか、ファイル名にすることはできないかどうかを確認しませんファイル名に有効でない文字が含まれています。つまり、バッチコードEXAMPLEは、ファイル検索を実行する前にユーザーが入力した内容をまったく検証しません。あなたは、ユーザーがファイル名を入力し、その入力を間違いの可能性がある場所で確認することができるばかばかなバッチファイルを作る方法を尋ねなかった。 – Mofi

関連する問題