1

ファイル名の最初の部分に基づいてフォルダーにファイルしたいファイルがたくさんあります。ファイル名 -> フォルダ名は、[-] [,] [および] の特定の文字で区切られます。例:

最初のファイル名 - 2016-04.pdf 2 番目のファイル名と別の名前.mp3 3 番目.jpg 4 番目のファイル名、2016.pdf

結果のフォルダー名に [\s-] [,\s] [\sand\s] の部分を含めないようにします。

フォルダー名に次のような不要なものが含まれていることを除いて、機能するスクリプトは次のとおりです。

最初のフォルダー名 - 4 番目のファイル名、

ハイフンを含めるのに貪欲な正規表現の一致に関係していると思いますが(特に)、クエリとその後のフォルダー名の作成をフォーマットする方法がわかりません。

また、「####」でコメントアウトされたもの (進行状況インジケーターなど) は機能しません。何か提案があれば、コメントしてください。私は決してプログラマーではありません。

$OrigFolder = ".\"
$NewFolder = ".\_Sorted to Move"

# Orphans folder, where files that return null in the regex match will be moved
# Example: file "- title.mp4"
# will be moved to ".\Sorted\_Orphans" folder

$Orphans = '_Orphans' # Use the underscore to sort the folder to the top of the window

#### How to use an array of values for the delimiters in the regex instead of literals
#### My proposed code, but I am missing how o use the delims in the regex match
#### $delims = "\s-\s" ",\s"\s and\s"

# First count the number of files in the $OrigFolder directory
$numFiles = (Get-ChildItem -Path $OrigFolder).Count
$i=0

# Tell the user what will happen
clear-host;
Write-Host 'This script will copy ' $numFiles ' files from ' $OrigFolder ' to _Sorted to Move'

# Ask user to confirm the copy operation
Read-host -prompt 'Press enter to start copying the files'

# Regex to match filenames
$Regex = [regex]"(^\s*(.*?)\s*-)|(^\s*(.*?),)|(^\s*(.*?)\s*and\s)"

    # Loop through the $OrigFolder directory, skipping folders
Get-ChildItem -LiteralPath $OrigFolder | Where-Object {!$_.PsIsContainer} |
    ForEach-Object {
        if($_.BaseName -match $Regex){

            #### Caluclate copy operation progress as a percentage
            #### [int]$percent = $i / $numFiles * 100

            # If first part of the file name is empty, move it to the '_Orphans' folder
            if(!$Matches[1]){
                $ChildPath = $Orphans
            } else {
                $ChildPath =  $Matches[1]
            }

# Generate new folder name
$FolderName = Join-Path -Path $NewFolder -ChildPath $ChildPath

# Create folder if it doesn't exist
    if(!(Test-Path -LiteralPath $FolderName -PathType Container)){
        $null = New-Item -Path $FolderName -ItemType Directory
    }

# Log progress to the screen
Write-Host "$($_.FullName) -> $FolderName"

# Move the file to the folder
            Move-Item -LiteralPath $_.FullName -Destination $FolderName

##### Tell the user how much has been moved
##### Write-Progress -Activity "Copying ... ($percent %)" -status $_  -PercentComplete $percent -verbose
##### $i++

    }
}

Write-Host 'Total number of files in '$OrigFolder ' is ' $numFiles
Write-Host 'Total number of files copied to '$NewFolder ' is ' $i
Read-host -prompt "Press enter to complete..."
clear-host;

また、StackOverflow ユーザーの皆様のご協力と、上記でまとめたコード スニペットに感謝いたします。

4

2 に答える 2

0

これは、私の .pdf ファイル (雑誌) を雑誌のタイトルにちなんで名付けられたサブディレクトリに移動するための完成したスクリプトです。正規表現の問題の解決を手伝ってくれた jisaak (Martin Brandl) に感謝します。'Magazine' を新しいフォルダに追加する解決策は、46/47 行にあります。おそらくほとんどの人にとって明らかですが、それを理解するのに1時間かかりました.

コードの合理化やインデントの修正などについての提案をお待ちしています。私はまだ Powershell のスタイルを認識しておらず、これが私の最初の試みです。

$OrigFolder = "T:\Magazines"
$NewFolder = "T:\Magazines\_Sorted to Move"

# Orphans folder, where files that return null in the regex match will be moved
# Example: file "- title.pdf"
# will be moved to ".\Sorted\_Orphans" folder

$Orphans = '_Orphans' # Use the underscore to sort the folder to the top of the window

#### How to use an array of values for the delimiters in the regex instead of literals
#### My proposed code, but I am missing how o use the delims in the regex match
#### $delims = "\s-\s" ",\s"\s and\s"

# First count the number of files in the $OrigFolder directory
$numFiles = (Get-ChildItem -Path $OrigFolder).Count
$i=0

# Tell the user what will happen
clear-host;
Write-Host 'This script will copy ' $numFiles ' files from ' $OrigFolder ' to _Sorted to Move'

# Ask user to confirm the copy operation
Read-host -prompt 'Press enter to start copying the files'

# Regex to match filenames
$Regex = [regex]"(?:(.*?)\s-)|(?:(.*?),\s)|(?:(.*?)\sand\s)"

# Loop through the $OrigFolder directory, skipping folders
Get-ChildItem -LiteralPath $OrigFolder | Where-Object {!$_.PsIsContainer} |
    ForEach-Object {
        if($_.BaseName -match $Regex){
        $ChildPath = $_.BaseName -replace $Regex

#Caluclate copy operation progress as a percentage
[int]$percent = $i / $numFiles * 100


# If first part of the file name is empty, move it to the '_Orphans' folder
if(!$Matches[1]){
    $ChildPath = $Orphans}
else {
    $ChildPath = $Matches[1]
    }


# Generate new folder name and append ' Magazine' to the new folder name
$FolderName = Join-Path -Path $NewFolder -ChildPath ($ChildPath + ' Magazine')

# Create folder if it doesn't exist
    if(!(Test-Path -LiteralPath $FolderName -PathType Container)){
    $null = New-Item -Path $FolderName -ItemType Directory}

# Log progress to the screen
Write-Host "$($_.FullName) -> $FolderName"

# Move the file to the folder
Move-Item -LiteralPath $_.FullName -Destination $FolderName

# Tell the user how much has been moved
Write-Progress -Activity "Copying ... ($percent %)" -status $_  -PercentComplete $percent -verbose
$i++
    }
}

Write-Host 'Total number of files in '$OrigFolder ' is ' $numFiles
Write-Host 'Total number of files copied to '$NewFolder ' is ' $i
Read-host -prompt "Press enter to complete..."
clear-host;

マルチメディア ファイルと画像のスクリプトも変更しましたが、これでどれだけ時間が節約できるかわかりません。ありがとう、マーティン!

于 2016-05-01T22:44:58.077 に答える