2014-09-19 2 views
2

확장자가 .flv 인 파일을 포함 할 수있는 수백 개의 하위 디렉토리가있는 서버가 있습니다. 90 일 이상. 나는이 파일들을 찾아야하지만, 그 이름에 "ProdStream"이라는 단어가있는 폴더에서만 찾을 수 있습니다.디렉토리 이름에 배치 또는 powershell을 사용하여 디렉토리 이름에 특정 텍스트가 들어있는 디렉토리 집합에서 90 일보다 오래된 파일 이동

이 목적은 로그에 보존 된 파일의 원래 경로를 사용하여 파일을 AWS (이 작업 스크립트가 있음)에 보관하는 것입니다.

나는 폴더를 포함하도록 지정합니다 사용하여 모든 하위 폴더에있는 파일을 찾을 수 있습니다

forfiles /P "SRC_PATH" /S /M *.flv /D -90 /C "cmd /C move @file "DEST_PATH"" 

그러나, forfiles 나를 변수로 폴더 이름을 사용하는 것을 허용하지 않습니다. 적어도 내가 시도한 것에는 그렇지 않다. 그래서 for 명령을 써 보았습니다.

set stream=SRC_PATH 
FOR /D /R %stream% %%X IN (ProdStream*) DO [something] 

제대로 작동하지만 부분적으로 만 파일을 찾기 위해 올바른 명령을 찾을 수 없습니다.

완전한 경로 정보가있는 파일 목록을 저장해야합니다. 난이 사용되었습니다 작동하지만, 폴더 이름에 ProdStream의 텍스트를 필터링하지 않습니다

forfiles /P "SRC_PATH" /S /M *.flv /D -90 /C "cmd /C echo @path @fsize" >MY_LOG_FILE 

합니다.

일괄 처리뿐만 아니라 PowerShell에서도이 작업을 수행 할 수 있습니다.

내 PowerShell은 약하지만 더 강해질 수 있습니다!

아이디어가 있으십니까?

서버 R2 엔터프라이즈 SP1이

답변

1

하면이 시도 당신을 위해 일 :

For /f "delims=" %%a in ('dir /ad/b/s c:\yourfolder\*Prodstream*') do (
forfiles /P "%%~fa" /M *.flv /D -90 /C "cmd /C move @file "DEST_PATH"" 
) 
1

내가하지 희망 PowerShell을 당신을 끌 수 있지만, 윈도우 2008입니다 이후

$Path = "C:\temp" 
$FolderFilter = "ProdStream" 
$copyPath = "C:\archive" 
$log = "c:\log" 

Get-ChildItem -Path $Path -Recurse | Where-Object { ! $_.PSIsContainer -and $_.Extension -eq ".flv" -and $_.CreationTime -lt (Get-Date).Adddays(-90) -and ($_.FullName -split "\\")[-2] -match $FolderFilter } | ForEach-Object{ 
    Add-Content -Path $log "The following was archived $($_.FullName)" 
    #Copy-Item -Path $_.FullName -Destination $copyPath 
} 

좋아, 내가하려고합니다 다음 나는 선물 옵션으로 이것을 고려 기꺼이 내가 할 수있는 한 최선을 다하십시오.

  1. Get-ChildItem을 사용하십시오. cmd와 같은 그것의 dir. $ path 변수로 지정된 시작 경로에서 모든 파일과 디렉토리를 검색합니다. 나는 그것이 당신이 원하는 것이 아니라 읽는 것을 안다.
  2. Where-Object 절은 일치하는 파일에 대한 기준의 마술이 일어나는 부분이다. 나는 조건을 무너 뜨릴 것이다

    • ! $_.PSIsContainer. PowerShell의 이전 버전이 있다고 가정합니다. 그러면 디렉토리가 아닌 모든 파일이 리턴됩니다.
    • $_.Extension -eq ".flv". 당신은 .flv 설득의 파일을 원했습니다.
    • $_.CreationTime -lt (Get-Date).AddDays(-90). 그러면 파일의 생성 된 시간이 지금부터 90 일보다 오래되었는지 확인하고 확인할 것입니다.
    • ($_.FullName -split "\\")[-2]. 이 조건은 파일 경로를 가져 와서 폴더 및 파일의 배열로 변환합니다. 해당 배열을 가져 와서 해당 파일의 폴더 이름이 될 두 번째 마지막 항목을 반환하십시오. 예를 들어 C:\temp\ProdStreamStuf\IMG_0571.JPG이면 ProdStreamStuf을 반환합니다.상위 폴더 이름을 가져와 여기에 ProdStream$FolderFilter이 포함되어 있는지 확인하십시오. -matchtrue이고 이름의 일부가 ProdStream 인 경우를 반환합니다. 또한 -match은 기본적으로 대/소문자를 구분하지 않습니다.
  3. 경우 위의 조건을 모두 각 파일을 가지고 같이 ForEach-객체를 통해이를 처리 후 만족. 참고 다른 Powershell cmdlet으로 바로 연결할 수 있지만이 기본을 유지하려고합니다. 당신은 그 모든$copyPath에 의해 지정되어 새로운 가정에 파일을 복사 Add-Content

  4. 후와 로그를 출력 로그에 파일의 전체 경로를있는 파일을 저장하고 싶었 언급

  5. 확장자가 .ps1 인 파일에 저장하면 두 번 클릭 할 수 있습니다.
  6. 테스트 위해 나는이 라인 실행을 방지 할 수 Copy-Item -Path $_.FullName -Destination $copyPath에 코멘트 #을 넣어 당신은 그냥 당신이 원하는 파일을 이동합니다 있는지 확인하기 위해 $log를 읽을 수 있습니다. 당신은 일반적으로 당신이 ExecutionPolicy와 관련하여 오류가 발생합니다 PowerShell 스크립트를 실행 해달라고하면 그 다음은 #

주에게 를 제거 작동하는지. 이 경우 PowerShell 세션을 열고 컴퓨터에서 로컬 서명되지 않은 스크립트 (예 : 방금 만든 서명 된 스크립트)를 허용하면서 인터넷의 스크립트를 서명해야하는 경우 Set-ExecutionPolicy remotesigned을 실행할 수 있습니다. 또한 필요한 경로와 일치하도록 $ 변수를 모두 변경해야합니다. 또한 얼마나 많은 파일과 폴더를 가지고 있느냐에 따라 조건을 재정렬 할 수 있습니다. PowerShell의 조건은 왼쪽에서 오른쪽으로 계산됩니다. 하나가 거짓이면 나머지를 평가하지 않습니다. 따라서 ($_.FullName -split "\\")[-2] -match $FolderFilter을 먼저 넣으면 부모 폴더에 ProdStream이 포함되어 있지 않으면 다른 것을 보지 않아도됩니다. 경우

관련 문제