Сценарий PowerShell работает в неправильном каталоге - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть скрипт, который корректно работает на других серверах, однако на этом одном сервере он работает в родительском каталоге, где предполагается запускать скрипт.Это только на этой машине и работает правильно, где-то еще.

Сценарий:

Param (
    [Parameter(Mandatory=$true)][string]$destinationRoot,
    [string]$localPath
)

Get-ChildItem $localPath\* -Include *.bmp, *.svg |
    Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-30)} |
    ForEach-Object {
        $content = $localPath + "\" + $_.Name

        $year = (Get-Item $content).LastWriteTime.Year.ToString()
        $monthNumber = (Get-Item $content).LastWriteTime.Month
        $month = (Get-Culture).DateTimeFormat.GetMonthName($monthNumber)

        $destination = $destinationRoot + "\" + $year + "\" + $month 

        New-Item -ItemType Directory -Force -Path $destination

        Move-Item -Path $content -Destination $destination -Force
    }

Вот оператор выполнения из приглашения CMD:

powershell -File "C:\L1_Vision_Images\MoveFiles.ps1" -destinationRoot "\\OB-VM-ME-Data\ME-Data\Archived\LEDTools\MT-1\L1Images\" -localPath "C:\L1_Vision_Images"

Вместо копирования содержимого в каталог L1_Vision_Images он сканирует кореньC:.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вы можете оптимизировать свой сценарий в различных точках,

  • $ содержимое совпадает с $ _. FullName,
  • $ _ уже присутствует как объект со всеми свойствами,
    , поэтому нет необходимости несколько раз вызывать Get-Item для LastWriteTime
  • . Вы можете создать папку \year\monthname, используя .ToString('\\yyyy\\MMMM')
    (экранирование обратной косой черты с другой, чтобы она была буквальной)

Param (
    [Parameter(Mandatory=$true)][string]$destinationRoot,
    [string]$localPath
)

Get-ChildItem $localPath\* -Include *.bmp, *.svg |
    Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-30)} |
    ForEach-Object {
        $destination = Join-Path $destinationRoot `
                       $_.LastWriteTime.ToString("\\yyyy\\MMMM")
        New-Item -ItemType Directory -Force -Path $destination
        $_ | Move-Item -Destination $destination -Force
    }
0 голосов
/ 27 ноября 2018

Конечная косая черта в аргументе для параметра -destinationRoot экранирует закрывающую двойную кавычку, что означает, что вместо \\OB-VM-ME-Data\ME-Data\Archived\LEDTools\MT-1\L1Images\ вы передаете \\OB-VM-ME-Data\ME-Data\Archived\LEDTools\MT-1\L1Images" -localPath C:\admin\scripts.

Просто проверяете значения вашего параметра в отладчикеили вывод их в начале скрипта (например, через Write-Host $destinationRoot) показал бы это вам.

Удалите завершающий обратный слеш из этого аргумента (он не нужен, так как вы добавляете обратный слеш при определении $destination в любом случае) и проблема исчезнет.

powershell -File "C:\L1_Vision_Images\MoveFiles.ps1" -destinationRoot "\\OB-VM-ME-Data\ME-Data\Archived\LEDTools\MT-1\L1Images" -localPath "C:\L1_Vision_Images"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...