使用FORFILES

使用FORFILES

こんにちは、私は現在学校で働いており、特定のファイル タイプについてすべての生徒のフォルダをスキャンするスクリプトを作成しました。削除する前に特定のファイル タイプのコピーを作成する方法はあるでしょうか? xcopy と robocopy はどちらも構文内にソース アドレスが必要なので、その方法が思いつきませんでした。これが私のスクリプトです。

@echo off
net use X: \\LOCATION FOR STUDENT FOLDERS
net use Y: \\LOCATION FOR COPIED FILES
net use Z: \\LOCATION FOR .TXT FILE OF DELETED FILES
X:
cls
Echo Deleting bat files please wait...
del /s *.bat > Z:\DeletedFiles.txt 2>&1
Echo Deleting CMD files please wait...
del /s *.cmd >> Z:\DeletedFiles.txt 2>&1
Echo Deleting VBS files please wait...
del /s *.vbs >> Z:\DeletedFiles.txt 2>&1
Echo Deleting Executable files please wait...
del /s *.exe >> Z:\DeletedFiles.txt 2>&1
mountvol X:\ /D
mountvol Y:\ /D
mountvol Z:\ /D
cls
Echo Process Completed. Drives Unmounted
set /p=Press Any Key To Close

以下のようなものを入力するのは簡単ではない(ましてや可能ではない)と思いますか?

xcopy *.bat Y:\

ちなみに、PowerShell スクリプトは実行する権限がないので自由に使用できません (愚かな教育部門)。ただし、PowerShell の代替手段がある場合は、それも投稿してください。学習に役立ちます。

答え1

使用FORFILES

この方法ならさらに理解しやすいかもしれません:

forfiles /P C:\Windows /S /M *.dll /C "cmd /c @echo @path"

これは、何も損なうことなくコマンド ラインから実行できる例です。

スクリプトでこれを使用する方法は次のとおりです。

forfiles /P X:\ /S /M *.bat /C "cmd /c @copy @path Y:\"

使用FOR

FOR /R X:\ %%B IN (*.bat) DO (
    copy "%%~fB" Y:\
    REM you could do the delete in here too, 
    REM but it's probably faster the way you have it
)

仕組み:

FORスイッチ付きのコマンドは、指定/Rされたディレクトリ (この場合はX:\セクションで定義されたパターン) を再帰的に検索しますIN。ここではパターン を指定しています*.bat。見つかったファイルごとに、 の後のステートメントを実行しますDO。見つかったファイルは変数に格納されます%%B(任意の文字を選択できます)。

(...)afterを使用すると、DOループの各反復で複数のコマンドを実行できるようになります。

%%~fBは、 の値を扱う特別な方法です%%B。 は~、このような特別なフォーマッタをすべて開始し、引用符が存在する場合はそれ自体で引用符を削除します。fは、値が相対的に使用されている場合に、値を完全なパス名としてフォーマットします。

for /?コマンドラインで実行するとFOR、 の機能と使用できる書式設定フラグの詳細な説明が表示されます。

注記

バッチ ファイル内にあるため、ヘルプで表示される の%%B代わりにを使用しています。コマンド ラインで直接実行できる のサンプルをいくつか示します。%BFOR

FOR /R C:\Windows %Q IN (*.ttf) DO @echo I am a font: "%Q"
FOR /R C:\Windows %Q IN (*.dll) DO @echo Full path to DLL: %~fQ

これらがバッチファイル内にある場合は、二重パーセント記号を使用する必要があります。

PowerShell について

また、PowerShell スクリプトを実行するために特別な権限は必要ないことも指摘しておきます。

実行ポリシーに関するエラーが発生した場合、これは単なる安全対策であり、PowerShell 内 (スクリプト内ではない) で以下を実行できます。

Set-ExecutionPolicy Bypass

もっと読むべき実行ポリシーについて可能な設定を完全に把握します。

スケジュールされたタスクを通じて PowerShell スクリプトを実行している場合は、次のように、スクリプトを呼び出すときに実行ポリシーを変更できます。

powershell.exe -ExecutionPolicy Bypass

スケジュールされたタスクからの完全な呼び出しは次のようになります。

powershell.exe -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -File C:\Scripts\script.ps1

答え2

ループを使用するFOR:

SETLOCAL EnableExtensions
For /R "X:\" %%I IN (*.bat) do (
    xcopy /i "%%I" "Y:\%%~nxI"
    del "%%I"
)

したがって、スクリプトは次のようになります。

@echo off
SETLOCAL EnableExtensions
net use X: \\LOCATION FOR STUDENT FOLDERS
net use Y: \\LOCATION FOR COPIED FILES
net use Z: \\LOCATION FOR .TXT FILE OF DELETED FILES
X:
cls
Echo Deleting bat, cmd, vbs, and exe files please wait...
For /R "X:\" %%I IN (*.*) do (
    set "isTrue="
    if (%%~xI == ".bat") set isTrue=1
    if (%%~xI == ".cmd") set isTrue=1
    if (%%~xI == ".vbs") set isTrue=1
    if (%%~xI == ".exe") set isTrue=1
    if defined isTrue (
        xcopy "%%I" "Y:\%%~nxI"
        del /s "%%I" > "Z:\DeletedFiles.txt" 2>&1
    )
)
mountvol X:\ /D
mountvol Y:\ /D
mountvol Z:\ /D
cls
Echo Process Completed. Drives Unmounted
set /p=Press Any Key To Close

関連情報