3

私はまだ PowerShell (vbscript から来ている) の初心者であり、あまりにも深刻なことをしてからしばらく経っています。

シナリオは次のとおりです。

私たちが使用しているシステムでは、ディレクトリ内に 30 分ごとにフォルダーが作成され、それらのサブフォルダー内に画像ファイルを作成できます (サブフォルダー内では異なる名前ですが、サブフォルダー全体で同じ規則であるため、SubFolderA には picture1.jpg、picture2 が含まれる場合があります。 jpg、picture3.jpg ですが、他のサブフォルダーも同様です。

ツリー全体を監視する必要があり、JPG ファイルが作成されるたびにコピーし、日付/時刻/秒に基づいて名前を変更し、「フラット」フォルダーに配置します。

以下のコードでは、動作は最初のフォルダーで期待どおりに機能します (また、複数のファイルを生成でき、それらすべてをコピーします)。ただし、ファイルが次のフォルダーに表示されると、コピーを実行していると表示されますが、その後ハングします。 . スクリプトからのエラーやフィードバックはありません。

スクリプトは「このコピーを実行しています」で停止しますが、他に何も起こりません。スクリプトを再起動すると、2 番目のフォルダーに変更が表示されるまで正常に機能します。それは、最初の変更が発生した任意のフォルダーであり、その後は失敗したように見える任意のフォルダーです。

イベントの動作を処理する際に何か間違ったことをしているように感じますが、それを理解するのに十分なほど理解していません。変更が 1 つのフォルダーのみで発生した場合、コード自体は正常に機能するようです。

ディレクトリ ツリーは次のようになります。

X:\PicsSource
X:\PicsSource\Folder 1\
X:\PicsSource\Folder 2\
X:\PicsSource\Folder 3\

また、ソースはネットワーク共有であり、宛先は最初はローカルですが、将来的にはネットワーク共有になる可能性があることにも言及する必要があります。私のテストでは、ソースと宛先の両方がネットワーク共有 (同じサーバー上) であり、スクリプトは別のマシンで実行されます。

各フォルダー内には多くのファイルがありますが、私は JPG にのみ関心があります。

私がこれまでに持っているコード:

Unregister-Event -SourceIdentifier FileCreated -ErrorAction SilentlyContinue
$folder = 'X:\PicsSource\'      #Folder to monitor
$destination = 'X:\PicsDest\'   #Folder to copy files too
$filter = '*.jpg'               #Set this for filtering of file types


$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
 IncludeSubdirectories = $true             
 NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}



$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
$path = $Event.SourceEventArgs.FullPath
$name = $Event.SourceEventArgs.Name

 $newname = get-item $path | Select @{Name="CreationTime";Expression= {"{0:yyyy}-{0:MM}-{0:dd}@{0:HH}{0:mm}_{0:ss}" -f ([DateTime]$_.CreationTime)}}
 #Write-host $newname
 $newname = $newname -replace "@{CreationTime="
 $newname = $newname -replace "}"
 #Write-Host $newname
 #Write-Host $destination
 #Write-Host $path
 $finaldest = $destination + $newname
 $finaldest = $finaldest + ".JPG" | Out-String
 $finaldest = $finaldest.Trim()
 write-host $finaldest
 Copy-Item -path $path -Destination $finaldest -Force -Verbose
}

作成時の文字列は少し乱雑ですが、機能的であると思います (ただし、改善が見られてうれしいです!)

事前に感謝します、私はこれを解決したいと思っています:)

乾杯、マット

4

1 に答える 1