2013-09-18 3 views
1

У меня есть ниже сценарий:Powershell - Copy Loop Script

function copyUserSettings { 
    Write-Host 
    $copyFrom = Read-Host 'Which Folders Do You Want To Copy FROM?' 
    Write-Host 
    $copyTo = Read-Host 'Which Folders Do You Want To Copy TO? (Enter a Number OR Range eg. 12-18)' 
    Write-Host 

    IF ($copyTo.Contains("-")) { 
     $copyToStart = $copyTo.Split("-")[0] 
     $copyToEnd = $copyTo.Split("-")[1] 

     $copyToStart..$copyToEnd | foreach{ 
      Copy-Item -Path $rootPath\FOLDER\$copyFrom\US*.DAT -Destination $rootPath\FOLDER\$_ 
     } 
    } else { 
     Copy-Item -Path $rootPath\FOLDER\$copyFrom\US*.DAT -Destination $rootPath\FOLDER\$copyTo 
    } 
} 

Пользователь должен ввести куда копировать файлы из (все имена папок просто номер), и куда копировать файлы (также просто число), введя имя одной папки или диапазон (например, 12-18). Если я введу один номер, приведенный выше сценарий работает правильно, но если я введу диапазон, файлы не будут копироваться, и я не получу никакой обратной связи или чего-либо еще.

Редактировать 1: $rootPath определено ранее в скрипте. Edit2: Измененный код выше для предложения @ tnw.

Заранее за вашу помощь. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

ответ

3

Похоже, что вы упустили закрытие кронштейна. Я переместил эту скобку туда, где это должно быть (я думаю). Чтобы избежать этих проблем, вам следует лучше использовать табуляцию:

function copyUserSettings { 
    Write-Host 
    $copyFrom = Read-Host 'Which Folders Do You Want To Copy FROM?' 
    Write-Host 
    $copyTo = Read-Host 'Which Folders Do You Want To Copy TO? (Enter a Number OR Range eg. 12-18)' 
    Write-Host 

    IF ($copyTo -Contains "-") { 
     $copyToStart = $copyTo.Split("-")[0] 
     $copyToEnd = $copyTo.Split("-")[1] 

     $copyToStart..$copyToEnd | foreach { 
      Copy-Item -Path $rootPath\FOLDER\$copyFrom\US*.DAT -Destination $rootPath\FOLDER\$_ 
     } #this bracket was missing 
    } else { 
     Copy-Item -Path $rootPath\FOLDER\$copyFrom\US*.DAT -Destination $rootPath\FOLDER\$copyTo 
    } 
} #you had an extra closing bracket here 

EDIT: Понял. Посмотрите на это:

"12-18" -Contains "-" 

Оценивает к false, так что ваш if никогда не оценивает к истине. Это связано с тем, что -Contains предназначено для коллекций, а не подстрок. Из документации: «Сообщает включает ли коллекция эталонных значений одного значения тест»

Попробуйте вместо этого:

IF ($copyTo.Contains("-")) 

Вы также можете использовать -Match оператор:

IF ($copyTo -Match "-") 
+0

Спасибо за ваш вклад. Я изменил свой сценарий с вашими предложениями и нашел где-то дополнительный кронштейн. Но, к сожалению, он по-прежнему производит такое же поведение. Очень странно. – Lawivido

+0

@Fro Вы сохранили свой сценарий? : D просто проверяю. Пожалуйста, дважды и тройной проверьте свои скобки ... как у вас было это, ваш 'else' был INSIDE ваш' if' ...который даже не имеет смысла! – tnw

+0

Да, я сохранил его: D Также изменил сценарий в исходном вопросе, чтобы вы могли видеть, где он сейчас. – Lawivido

0

Если я правильно понял ваш вопрос, предполагается, что $ _ будет именем папки назначения. Но ваш скрипт не знает, что так обрабатывает $ _ как имя файла. Вам необходимо создать папки назначения (если они не существуют) и изменить пункт назначения «Копировать-Пункт». Пример:

$copyToStart..$copyToEnd | foreach { 
    New-Item -Type Directory -Path $rootPath\FOLDER\$_ 
    Copy-Item -Path $rootPath\FOLDER\$copyFrom\US*.DAT -Destination $rootPath\FOLDER\$_\US*.DAT 
} 
+0

Вы правы, что $ _ - это имена папок. Но папки уже существуют, поэтому мне не нужно использовать New-Item. – Lawivido

1

В -contains оператор проверяет, является ли набор (например, список/массив) содержит конкретный элемент. Для того, чтобы проверить, если строка содержит определенный символ, который нужно использовать -like или -match оператора:

$copyTo -like '*-*' 

$copyTo -match '-' 

Оператор -match также позволит вам проверить, если строка содержит число в нужных местах и ​​извлекать эти цифры из строка:

if ($copyTo -match '^(\d+)-(\d+)$') { 
    $start = $matches[1] 
    $end = $matches[2] 
} 

Другим вариантом будет использование Contains() метода класса строки, как tnw предложил:

$copyTo.Contains('-')