>

D:\TestARC_Source 라는 디렉토리에 다음과 같은 수백 개의 Excel 파일이 있습니다.

5020190429.dat
5120190429.dat
602019111121.dat
702019050926.dat 
etc.

파일 이름의 처음 두 문자를 기준으로 각 폴더로 이동하려면 스크립트가 필요합니다. 대상 디렉토리에 폴더가 이미 생성되어 있습니다.

D:\TestARC_Destination\file_50
D:\TestARC_Destination\file_51
D:\TestARC_Destination\file_60
D:\TestARC_Destination\file_70

파일 이름의 처음 두 문자를 기준으로 파일이 각 폴더로 이동해야합니다. 예를 들어 5020190429.dat   50_file 로 이동  폴더.

아래 스크립트를 편집하려고하는데 작동하지 않습니다. PS 스크립트에 대한 지식이 거의 없으며 도움을 주시면 감사하겠습니다.

$SourceFolder = "C:\Users\Administrator\Desktop\ARC_Testing\TestARC_Source\"
$targetFolder = "C:\Users\Administrator\Desktop\ARC_Testing\TestARC_Destination\"
# Find all files matching *.sql in the folder specified
Get-ChildItem -Path $SourceFolder -Filter *.dat | ForEach-Object {
    # Combine the source filename and target directory
    # The source filename has all instances of _ replaced with \
    # Cast the resulting string to a FileInfo object to take advantage of extra methods
    [System.IO.FileInfo]$destination = (Join-Path -Path $targetFolder -ChildPath $_.Name.replace("_","\"))
    # Create the directory if it doesn't already exits
    if (!(Test-Path) $destination.Directory.FullName)
    { 
        New-item -Path $destination.Directory.FullName -ItemType Directory 
    }
    # Copy the source to the target directory
    copy-item -Path $_.FullName -Destination $Destination.FullName 
}

  • 답변 # 1

    다음은 기준에 따라 파일을 이동해야합니다. -WhatIf 를 제거하십시오  이동할 내용에 만족하면 전환합니다.

    $Source = "D:\TestARC_Source"
    $Dest = "D:\TestARC_Destination"
    $FilesToMove = Get-ChildItem -Path $Source -File -Recurse -Filter "*.dat" -Include "[0-9][0-9]*"
    Foreach ($file in $FilesToMove) {
        Move-Item -Path $file -Destination "$Dest\File_$($file.basename.substring(0,2))” -WhatIf
    }
    
    

  • 답변 # 2

    파일을 첫 번째 두 자리로 그룹화하는 효율적인 접근 방법입니다.
    폴더가 존재하는지 확인하고 (필요한 경우 생성) 파일을 한 번에 이동하십시오.

    ## Q:\Test\2019\05\31\SO_56397901.ps1
    $SourceFolder = "C:\Users\Administrator\Desktop\ARC_Testing\TestARC_Source\"
    $targetFolder = "C:\Users\Administrator\Desktop\ARC_Testing\TestARC_Destination\"
    Get-ChildItem -Path "$SourceFolder[0-9][0-9]*" -Filter *.dat | 
       Group-Object {"file_"+$_.BaseName.Substring(0,2)}| ForEach-Object {
          $TargetDir = Join-Path $targetFolder $_.Name
          if(!(Test-Path $TargetDir)){MD $TargetDir | Out-Null}
          $_.Group.FullName | Move-Item -Destination $TargetDir #-WhatIf
    }
    
    

    위의 테스트 데이터로 실행 한 후 트리 :

    > TREE /f
    ├───FILE_50
    │       5020190429.DAT
    │
    ├───FILE_51
    │       5120190429.DAT
    │
    ├───FILE_60
    │       602019111121.DAT
    │
    └───FILE_70
            702019050926.DAT
    
    

    수정 : 요구 사항 변경은 일반적으로 새로운 질문을 할 수 있지만 변경은 최소입니다

    ## Q:\Test\2019\05\31\SO_56397901.ps1
    $SourceFolder = "C:\Users\Administrator\Desktop\ARC_Testing\TestARC_Source\"
    $targetFolder = "C:\Users\Administrator\Desktop\ARC_Testing\TestARC_Destination\"
    Get-ChildItem -Path "$SourceFolder[0-9][0-9]*" -Filter *.dat | 
       Group-Object {$_.BaseName.Substring(0,2)+"_file"}| ForEach-Object {
          $TargetDir = Join-Path $targetFolder $_.Name
          if(Test-Path $TargetDir){
              $_.Group.FullName | Move-Item -Destination $TargetDir #-WhatIf
          } else {
              "{0} doesn't exist, files not moved: {1}" -f $TargetDir,($_.Group.FullName -join ';')
          } 
    }
    
    

관련 자료

  • 이전 javascript - Excel에서 데이터 가져 오기 및 Chartjs에서 사용
  • 다음 Java @ interfaceList 사용자 정의 제한 조건 주석 내에서 그룹이 작동하지 않습니다