2016-12-21 4 views
1

Учитывая документацию Microsoft для PowerShell, я не вижу причин, по которым следующий код должен завершиться с данной ошибкой. Опять же, PowerShell может выйти из строя, если скрипт слишком длинный. Все пути являются строками с двойной кавычкой.PowerShell New-Item Позиционный параметр Oddities

##### ALGORITHM Take in keystore path, make a backup in an adjacent directory 
$ksPath = $java_store_path.Substring(0, $java_store_path.LastIndexOf('\') + 1) 
$backupPath = $ksPath + "backups" 
New-Item $backupPath PowerShell -type directory -force 

New-Item: Позиционный параметр не может быть найден, который принимает аргумент 'PowerShell.

https://technet.microsoft.com/en-us/library/ee176914.aspx

New-Item c:\scripts\Windows PowerShell -type directory 

Если это действительно, мое должно быть тоже. Я работаю на сервере Server R2 R2.

ответ

5

Пример на этой странице просто неправильный. Кажется, они имели в виду ссылку на путь C:\Scripts\WindowsPowerShell, или они забыли процитировать каталог с пробелами в нем.

Так оно и должно быть один из них:

New-Item c:\scripts\WindowsPowerShell -type directory 
New-Item 'c:\scripts\Windows PowerShell' -type directory 
New-Item "c:\scripts\Windows PowerShell" -type directory 

Спросите себя, что бы PowerShell одиночку имел в виду? Каким параметром он бы соответствовал?


Edit: как комментаторы указывали, например, должен был показать nameSet параметры, где указаны отдельные -Path и -Name, и якобы PowerShell должен был быть значение параметра -Name. Это выглядит правильно. Причина, по которой этот пример не сработал (и ваш, а также), состоит в том, что параметр не может быть указан позиционно, что вы можете увидеть в статье I MSDN, приведенной ниже, и в встроенной справке:

Type: String 
Parameter Sets: nameSet 
Aliases: 

Required: True 
Position: Named 
Default value: None 
Accept pipeline input: True (ByPropertyName) 
Accept wildcard characters: False 

В этом случае их пример должен был что-то вроде этих:

New-Item c:\scripts\Windows -Name PowerShell -type directory 
New-Item -Path c:\scripts\Windows -Name PowerShell -type directory 

Так вновь заявляя, названные параметры работали бы здесь, и позволило бы избежать путаницы.


Как правило, вы не должны использовать позиционные параметры в сценариях, если только они не очень ясно (и даже тогда, я бы рекомендовал избегать).

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

Я думаю, вы должны изменить ваши, чтобы:

New-Item -Path $backupPath -Type Directory -Force 

И глядя на этот Technet статье, это на самом деле не так хорошо. MSDN article on New-Item лучше, и это информация, которую вы должны увидеть при запуске Get-Help New-Item.


Боковой вопрос:

Затем снова, PowerShell может потерпеть неудачу, когда сценарий просто получает слишком долго.

Что?

+0

Я не шучу. У нас есть 5000-строчный монолитный PS, который настраивает настройку сервера, конфигурацию и обслуживание. Он сломался, потому что он слишком большой. Параметры просто проваливаются через функции в позиции друг друга без какой-либо прозрачной причины, и мы использовали инструменты статического анализа LLVM для проверки правильности написания потоков данных. После 5400 строк он просто разваливается сам по себе. Мы в процессе разбивки его на несколько скриптлетов. – patrickjp93

+0

Согласовано. В конкретном примере указано, что он создаст новую папку с именем 'Windows PowerShell' в папке' C: \ Scripts'. – andyb

+0

@andyb, смотря далее Я согласен с тобой и (теперь удалённым) другим комментарием, хотя я думаю, что это только добавляет, что позиционные параметры могут ввести в заблуждение. Я отредактировал, чтобы уточнить. Благодаря! – briantist

Смежные вопросы