Move-Item для исправления пункта назначения - PullRequest
0 голосов
/ 03 мая 2018

Сценарий:

  1. Создает список папок на основе имен файлов в корневом каталоге скриптов, каждая папка разбивает имя на «Год / Месяц / День»
  2. Перемещает каждый файл в указанную папку

Сообщение об ошибке:

 CategoryInfo : ObjectNotFound: 
(S:\Data\TECHNOL...59_20180108.txt:String) 
[Move-Item], ItemNotFoundException FullyQualifiedErrorId : 
PathNotFound,Microsoft.PowerShell.Commands.MoveItemCommand 

My Issue

Файлы не будут перемещены на правильный конечный путь

#Create Directory
Set-StrictMode -Version 2
$rootPath = split-path -parent $MyInvocation.MyCommand.Definition
cd $rootPath
$FileNameArray = Get-ChildItem -Filter "*.txt"
$FileNameArray = $FileNameArray -replace "....$"
$FileNameArray = $FileNameArray -replace "^59_"

Foreach($f in $FileNameArray)
{
        $Year = $f -replace "^\d{0}|\d{4}$" #"....$"
        $Month = $f -replace "^\d{4}|\d{2}$"
        $Month = $Month | sort -Unique
        $Day = $f -replace "^\d{6}|\d{0}$"
        #Loop 2a
        Foreach($m1 in $Month){
        #Loop 2a-a
            Foreach($d1 in $Day){
                Move-Item -Path ($rootPath + '\59_' + $file + '.txt') 
-Destination ($rootPath + '\' + $Year + '\' + $m1 + '\' + $d1)
                }
        }
}

Извиняюсь за код спагетти и простой вопрос, я новичок в области компьютерных наук и PowerShell.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Следующий скрипт имеет две функции безопасности:

  1. У команды MD есть завершающий -confirm, на который вы должны ответить
  2. Move-Item имеет -WhatIf, который показывает, что будет сделано без параметра

Если скрипт работает нормально, удалите их обоих.


## Q:\Test\2018\05\03\SO_50158185.ps1
Set-StrictMode -Version 2
$rootPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
cd $rootPath

Get-ChildItem "59_20[0-9][0-9][0-1][0-9][0-3][0-9].txt" |
  Where-Object {$_.BaseName -Match '59_(?<year>\d{4})(?<Month>\d{2})(?<Day>\d{2})'}|
    ForEach-Object {
      $DestDir = Join-Path $rootPath ("{0}\{1}\{2}" -f $Matches.Year,$Matches.Month,$Matches.Day)
      If (!(Test-Path $DestDir)) {MD $DestDir -Confirm| Out-Null}
      $_ | Move-Item -Destination $DestDir -WhatIf
    }
0 голосов
/ 03 мая 2018

Разобрались, ребята! Просто нужно было изменить $ file на $ f. Спасибо за помощь.

...