사용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(어떤 문자든 선택할 수 있습니다).

(...)뒤에 사용하면 DO루프의 각 반복에서 여러 명령을 실행할 수 있습니다.

%%~fB의 값을 처리하는 특별한 방법입니다 %%B. 는 ~이러한 모든 특수 포맷터를 시작하고 따옴표가 있는 경우 자동으로 제거합니다. f상대 경로로 사용되는 경우 값을 전체 경로 이름으로 형식화합니다.

for /?명령줄에서 실행하면 FOR의 기능과 사용할 수 있는 형식 지정 플래그에 대한 매우 자세한 설명이 제공됩니다.

메모

배치 파일 내부에 있기 때문에 도움말에서 표시되는 %%B대신 을 사용하고 있습니다 . 다음은 명령줄에서 직접 실행할 수 있는 %B몇 가지 샘플입니다 .FOR

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 내에서 다음을 실행할 수 있습니다.

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

관련 정보