1

誤解のために変更する必要があるスクリプトがあります。製造フロアにワークステーションがあり、次の構造のファイルを作成します - 04_R_____"109402"0076_9999992_35_401_"01_20121107"_134029_0667.I00.asd (ファイル名の引用部分は解析する必要がある部分。

ファイル名の最初の部分を含む配列を既に作成しており、powershell プログラムはそのデータを解析できます。ただし、ファイル名の 2 番目の部分には、パーツ番号、テスト ベンチ番号 (01、02、03 など)、および日付で作成されたフォルダー構造が必要です。フォルダーが存在しない場合は、一致する場合にのみフォルダーを作成します。

私の現在のスクリプトはプレフィックスでフィルタリングし(これは間違っています)、すべてのフォルダーを毎日作成します(一致ではありません)。部分文字列を使用して、01、02、03 などをキャッチするために非常に多くの文字を除外したいと考えています。ホイールを再作成せずに、いくつかの変更を加えて現在のコードを使用することは可能でしょうか? 私のテストコードはすべて含まれており、どんな助けでも大歓迎です!

  • 109402 = パーツリスト
  • 01 - テストベンチマシン
  • 20121107 - 日付

コード:

$source ="\\127.0.0.1\baunhof\*"
$archive = "\\127.0.0.1\error\\"
#$past=(Get-date).AddDays(-2)

$destination ="\\127.0.0.1\TestFolder1\\"
$destination1="\\127.0.0.1\TestFolder2\\"
$destination2="\\127.0.0.1\TestFolder3\\"
$destination3="\\127.0.0.1\TestFolder4\\"
#array for all destinations
$destination_array=@("$destination", "$destination1", "$destination2", "$destination3")

#creates folder yyyy/mm/dd
#$today = (Get-date -format yyyy/MM/dd)
#new-item -type directory ($today)
$DTS = ( get-date ).ToString('yyyy/MM/dd')

#array for file prefix
$File_Array_8HP70=@("*108701*")
$File_Array_8HP70X=@("*108702*")
$File_Array_9HP48=@("*109401*", "*1094080*", "*1094090*")
$File_Array_9HP48X=@("*109402*", "*1094091*", "*1094082*", "*1094092*")

#test bench number array filter
$test_bench_01=@("*_01_*")
$test_bench_02=@("*_02_*")
$test_bench_03=@("*_03_*")
$test_bench_04=@("*_04_*")

#Error log function: will write to application on server
function Write-EventLog {
  param([string]$msg = "Default Message", [string]$type="Information")
  $log = New-Object System.Diagnostics.EventLog
  $log.set_log("Application")
  $log.set_source("PSscript")
  $log.WriteEntry($msg,$type)
}

Write-Eventlog "Acoustic file parse program has started"

# if statement checks if $destination_array[0] is false then new item
$destination_array[0] = "\\127.0.0.1\TestFolder1\today\" 
If (!(Test-Path -path $destination_array[0])) {
  new-item -type directory "\\127.0.0.1\TestFolder1\$DTS"
  new-item -type directory "\\127.0.0.1\TestFolder1\P01\$DTS"
  new-item -type directory "\\127.0.0.1\TestFolder1\P02\$DTS"
  new-item -type directory "\\127.0.0.1\TestFolder1\P03\$DTS"
  new-item -type directory "\\127.0.0.1\TestFolder1\P04\$DTS"
}

$destination_array[1] = "\\127.0.0.1\TestFolder2\today\"
If (!(Test-Path -path $destination_array[1])) {
  new-item -type directory "\\127.0.0.1\TestFolder2\$DTS\"
  new-item -type directory "\\127.0.0.1\TestFolder2\P01\$DTS"
  new-item -type directory "\\127.0.0.1\TestFolder2\P02\$DTS"
  new-item -type directory "\\127.0.0.1\TestFolder2\P03\$DTS"
  new-item -type directory "\\127.0.0.1\TestFolder2\P04\$DTS"
}

$destination_array[2] = "\\127.0.0.1\TestFolder3\today\"
If (!(Test-Path -path $destination_array[2])) {
  new-item -type directory "\\127.0.0.1\TestFolder3\$DTS\"
  new-item -type directory "\\127.0.0.1\TestFolder3\P01\$DTS"
  new-item -type directory "\\127.0.0.1\TestFolder3\P02\$DTS"
  new-item -type directory "\\127.0.0.1\TestFolder3\P03\$DTS"
  new-item -type directory "\\127.0.0.1\TestFolder3\P04\$DTS"
}

$destination_array[3] = "\\127.0.0.1\TestFolder4\today\"
If (!(Test-Path -path $destination_array[3])) {
  new-item -type directory "\\127.0.0.1\TestFolder4\$DTS\"
  new-item -type directory "\\127.0.0.1\TestFolder4\P01\$DTS"
  new-item -type directory "\\127.0.0.1\TestFolder4\P02\$DTS"
  new-item -type directory "\\127.0.0.1\TestFolder4\P03\$DTS"
  new-item -type directory "\\127.0.0.1\TestFolder4\P04\$DTS"
}

$destination="\\127.0.0.1\TestFolder1\$DTS"
$destination1="\\127.0.0.1\TestFolder2\$DTS"
$destination2="\\127.0.0.1\TestFolder3\$DTS"
$destination3="\\127.0.0.1\TestFolder4\$DTS"
$destination_array=@  ("$destination", "$destination1", "$destination2", "$destination3")

# filter works below - need to use array

#$files = get-childitem $source -filter "108701*" -recurse
#foreach ($file in $files)
#{move-item $file.fullname $destination_array[0] -force}

$File_Array_8HP70_start = $File_Array_8HP70 | % {$_+"*"} 
$files = get-childitem $source -include $File_Array_8HP70_start -recurse
foreach ($file in $files) {
  move-item $file.fullname $destination_array[0] -force
}
#filter test bench
$files01 = gci $destination_array[0] -filter "01_*" -recurse
$files02 = gci $destination_array[0] -filter "02_*" -recurse
$files03 = gci $destination_array[0] -filter "03_*" -recurse          
$files04 = gci $destination_array[0] -filter "04_*" -recurse

$destination_array[0]="\\127.0.0.1\TestFolder1\P01\$DTS"
foreach ($file in $files01) {
  move-item $file.fullname $destination_array[0] -force
}
$destination_array[0]="\\127.0.0.1\TestFolder1\P02\$DTS"
foreach ($file in $files02) {
  move-item $file.fullname $destination_array[0] -force
}
$destination_array[0]="\\127.0.0.1\TestFolder1\P03\$DTS"
foreach ($file in $files03) {
  move-item $file.fullname $destination_array[0] -force
}
$destination_array[0]="\\127.0.0.1\TestFolder1\P04\$DTS"
foreach ($file in $files04) {
  move-item $file.fullname $destination_array[0] -force
}

$File_Array_8HP70X_start = $File_Array_8HP70X | % {$_+"*"}
$files = get-childitem $source -include $File_Array_8HP70X_start -recurse
foreach ($file in $files) {
  move-item $file.fullname $destination_array[1] -force
}
#$files02 = gci $destination_array[1] -filter "02_*" -recurse
$files01 = gci $destination_array[1] -filter "01_*" -recurse
$files02 = gci $destination_array[1] -filter "02_*" -recurse
$files03 = gci $destination_array[1] -filter "03_*" -recurse          
$files04 = gci $destination_array[1] -filter "04_*" -recurse

$destination_array[1]="\\127.0.0.1\TestFolder2\P01\$DTS"
foreach ($file in $files01) {
  move-item $file.fullname $destination_array[1] -force
}
$destination_array[1]="\\127.0.0.1\TestFolder2\P02\$DTS"
foreach ($file in $files02) {
  move-item $file.fullname $destination_array[1] -force
}
$destination_array[1]="\\127.0.0.1\TestFolder2\P03\$DTS"
foreach ($file in $files03) {
  move-item $file.fullname $destination_array[1] -force
}
$destination_array[1]="\\127.0.0.1\TestFolder2\P04\$DTS"
foreach ($file in $files04) {
  move-item $file.fullname $destination_array[1] -force
}

$File_Array_9HP48_start = $File_Array_9HP48 | % {$_+"*"}
$files = get-childitem $source -include $File_Array_9HP48_start -recurse
foreach ($file in $files) {
  move-item $file.fullname $destination_array[2] -force
}
#$files03 = gci $destination_array[2] -filter "03_*" -recurse
$files01 = gci $destination_array[2] -filter "01_*" -recurse
$files02 = gci $destination_array[2] -filter "02_*" -recurse
$files03 = gci $destination_array[2] -filter "03_*" -recurse
$files04 = gci $destination_array[2] -filter "04_*" -recurse

$destination_array[2]="\\127.0.0.1\TestFolder3\P01\$DTS"
foreach ($file in $files01) {
  move-item $file.fullname $destination_array[2] -force
}
$destination_array[2]="\\127.0.0.1\TestFolder3\P02\$DTS"
foreach ($file in $files02) {
  move-item $file.fullname $destination_array[2] -force
}
$destination_array[2]="\\127.0.0.1\TestFolder3\P03\$DTS"
foreach ($file in $files03) {
  move-item $file.fullname $destination_array[2] -force
}
$destination_array[2]="\\127.0.0.1\TestFolder3\P04\$DTS"
foreach ($file in $files04) {
  move-item $file.fullname $destination_array[2] -force
}

$File_Array_9HP48X_start = $File_Array_9HP48X | % {$_+"*"}
$files = get-childitem $source -include $File_Array_9HP48X_start -recurse
foreach ($file in $files) {
  move-item $file.fullname $destination_array[3] -force
}
#$files04 = gci $destination_array[3] -filter "04_*" -recurse
$files01 = gci $destination_array[3] -filter "01_*" -recurse
$files02 = gci $destination_array[3] -filter "02_*" -recurse
$files03 = gci $destination_array[3] -filter "03_*" -recurse
$files04 = gci $destination_array[3] -filter "04_*" -recurse

$destination_array[3]="\\127.0.0.1\TestFolder4\P01\$DTS"
foreach ($file in $files01) {
  move-item $file.fullname $destination_array[3] -force
}
$destination_array[3]="\\127.0.0.1\TestFolder4\P02\$DTS"
foreach ($file in $files02) {
  move-item $file.fullname $destination_array[3] -force
}
$destination_array[3]="\\127.0.0.1\TestFolder4\P03\$DTS"
foreach ($file in $files03) {
  move-item $file.fullname $destination_array[3] -force
}
$destination_array[3]="\\127.0.0.1\TestFolder4\P04\$DTS"
foreach ($file in $files04) {
  move-item $file.fullname $destination_array[3] -force
}
#move files to c:\Error if older than 2 days
$file_2 = gci $source -recurse|where {$_.LastWriteTime -lt (get-date).AddDays(-2)}
foreach ($file in $file_2) {
  move-item $file.fullname $archive -force
}

Write-Eventlog "Acoustic file parse program has completed"
4

1 に答える 1

1

あなたはすべてを手作業でやろうとしています。しないでください。

PowerShellに作業を任せます。

$DTS = (Get-Date).FormatDate('yyyy/MM/dd')

$parts_lists = @(
  @("108701"),
  @("108702"),
  @("109401", "1094080", "1094090"),
  @("109402", "1094091", "1094082", "1094092")
)

$destination_dirs = @(
  "\\127.0.0.1\TestFolder1",
  "\\127.0.0.1\TestFolder2",
  "\\127.0.0.1\TestFolder3",
  "\\127.0.0.1\TestFolder4"
)

# The following regular expression defines 2 sub-matches for parts list
# and test bench.
$re = "^\d{2}_[A-Z]___(\d{6})\d{4}_\d{7}_\d{2}_\d{3}_(\d{2})_\d{8}_\d{6}_\d{4}\.[A-Z]\d{2}\.asd$"

Get-ChildItem $source -Recurse | ? { $_.Name -match $re } | % {
  # process only files that match the given regular expression

  # iterate over all 4 parts lists
  for ($i = 0; $i -le 3; $i++) {
    if ( $parts_lists[$i] -contains $matches[1] ) {
      # if the first sub-match (the parts list number) is found in the current
      # parts list, construct a destination path from the corresponding base
      # directory, the test bench number and the date.
      $dest = Join-Path $destination_dirs[$i] -ChildPath "P$($matches[2])\$DTS"

      # Create the destination if it doesn't exist. Creating it here ensures
      # that a destination folder is only created when there's actually a
      # file going into it.
      if ( -not (Test-Path -LiteralPath $dest) ) {
        New-Item -Type Directory $dest
      }

      # Move the file ...
      Move-Item $_.FullName $dest -Force
      # ... end exit from the for-loop (no need to check other parts lists
      # once we found a match).
      break
    }
  }
}

私があなたのコードを完全に理解したかどうかわからないので、私のサンプルコードは調整が必要かもしれませんが、それはあなたに一般的な考えを与えるはずです。

注意する必要があることの1つは、日付形式yyyy/MM/ddが地域の日付区切り文字を使用して日付文字列を提供することです。つまり、米国ロケールのシステムでは日付文字列が生成2013/02/15されますが、ドイツ語ロケールのシステムでは日付文字列は次のようになります。2013.02.15。日付部分をスラッシュで区切る場合(パスでその日付を使用すると、PowerShellはパス区切り文字として解釈します)、フォーマット文字列でスラッシュをエスケープする必要がありますyyyy\/MM\/dd

編集:正規表現には2つの目的があります。

  • パターンに一致するファイルのみに処理を制限し、
  • ファイル名のパーツリストとテストベンチパーツへのアクセスを許可します。

このパターンは、指定したファイル名の例から派生しています。

04_R ___ 109402 0076_9999992_35_401_ 01_20121107 _134029_0667.I00.asd

  • ^:文字列の先頭。
  • \d{2}_:2桁の後にアンダースコアが続きます。
  • [A-Z]___:1つの大文字とそれに続く3つのアンダースコア。
  • (\d{6}):6桁のグループ(パーツリスト番号を表す)。グループには、後で。を介してアクセスできます$matches[1]
  • \d{4}_:4桁の後にアンダースコアが続きます。
  • \d{7}_:7桁の後にアンダースコアが続きます。
  • \d{2}_:2桁の後にアンダースコアが続きます。
  • \d{3}_:3桁の後にアンダースコアが続きます。
  • (\d{2})_:2桁のグループ(テストベンチマシン番号を表す)とそれに続くアンダースコア。グループには、後で。を介してアクセスできます$matches[2]
  • \d{8}_:8桁(日付)の後にアンダースコアが続きます。
  • \d{6}_:6桁の後にアンダースコアが続きます。
  • \d{4}\.:4桁の後に1つのドットが続きます。
  • [A-Z]\d{2}:1つの大文字とそれに続く2桁の数字。
  • \.asd:単一のドットの後に小文字asおよびd(拡張子)が続きます。
  • $:文字列の終わり。
于 2013-02-15T14:11:03.067 に答える