Сценарий PowerShell работает в Linux (Ubuntu pwsh), но не в Windows

Следующий скрипт powershell упорядочивает файлы по их расширению в соответствующем каталоге. Что я сделал, так это сначала нашел все уникальные расширения в целевой папке и вызвал копию для всех этих расширений, но это не работает в Windows. Я использовал правильный путь для Windows.

В настоящее время папки создаются, но файл не копируется из исходной папки в папку назначения.

$source = "/home/shubham/ps/" #location of starting directory
$destination = "/home/shubham/ps/check"; #location where files will be   `copied to`
$extensionArray = @(Get-ChildItem ($source) |
                  Select-Object Extension |
                  Sort-Object Extension |
                  Get-Unique -AsString)
echo ($extensionArray[3])
[string[]]$l_array = ($extensionArray | Out-String -Stream) -notmatch '^$' |
                     select -Skip 2

for ($i=0; $i -lt $extensionArray.Length; $i++) {
    $x = $l_array[$i]

    $ext = "*" + "$x"

    #foreach ($x in $extension_array){
    echo ("*" + ($x))
    $newsrc = ($source) + "/" + ($ext)
    $files = @("", "*" + ($x)) #edit .xlsx to your desired extension
    $outputPath = ($destination) + "_" + ($x)

    New-Item -ItemType Directory -Force -Path ($outputpath);
    Copy-Item -Path $newsrc -Filter ($ext) -Destination $outputPath -Container 
}
echo "end"

person subham kumar    schedule 30.11.2018    source источник
comment
Что определяет не работает? Вы получаете сообщения об ошибках или что-то еще происходит?   -  person trebleCode    schedule 30.11.2018
comment
Изменить при условии, что в настоящее время файлы не копируются из одной папки в другую в Windows, но отлично работает в Ubuntu.   -  person subham kumar    schedule 30.11.2018
comment
Пробовали ли вы использовать параметры -Force и -Debug с Move-Item в Windows, чтобы посмотреть, что происходит? Кроме того, пробовали ли вы выполнить код в PS ISE в Windows для просмотра значений переменных?   -  person trebleCode    schedule 30.11.2018
comment
Пожалуйста, прекратите эти странные скобки вокруг переменных.   -  person Ansgar Wiechers    schedule 30.11.2018


Ответы (1)


В случае сомнений прочитайте документация (выделено мной):

-Path
Указывает в виде массива строк путь к копируемым элементам.
Тип: String[]
Позиция: 1
Значение по умолчанию: None
> Принимать ввод конвейера: True (ByPropertyName, ByValue)
Допускать подстановочные знаки: False

Это означает, что такие пути, как /home/shubham/ps/*.docx, не поддерживаются Copy-Item. Это, вероятно, работает в Linux, потому что оболочка уже расширяет подстановочный знак до списка абсолютных путей до того, как Copy-Item его увидит.

Не говоря уже о том, что ваш код слишком сложен. Что-то вроде этого должно быть достаточно:

$src = '/home/shubham/ps/'
$dst = '/home/shubham/ps/check'

$files = Get-ChildItem $src

$files |
    Select-Object -Expand Extension -Unique |
    New-Item -Path $dst -Name {'_' + $_.TrimStart('.')} -Type Directory |
    Out-Null

$files | Copy-Item -Destination {Join-Path $dst ('_' + $_.Extension.TrimStart('.')} -Container
person Ansgar Wiechers    schedule 30.11.2018