【问题标题】:PowerShell New-Item Positional Parameter OdditiesPowerShell 新项目位置参数奇数
【发布时间】:2017-05-07 12:29:31
【问题描述】:

鉴于 PowerShell 的 Microsoft 文档,我看不出为什么以下代码会因给定错误而失败。再说一次,当脚本变得太长时,PowerShell 可能会失败。所有路径都是双引号字符串。

##### 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 2012 R2 上运行。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    该页面上的示例完全错误。似乎他们打算引用路径 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 单独指的是什么?它会对应什么参数?


    编辑:正如评论者指出的那样,该示例应该显示 nameSet 参数,其中指定了单独的 -Path-Name,据称 PowerShell 应该是-Name 参数。这看起来确实正确。该示例不起作用(以及您的示例)的原因是因为无法按位置指定 -Name 参数,您可以在下面链接到的 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 可能会失败。

    什么?

    【讨论】:

    • 我不是在开玩笑。我们有一个 5000 行的 PS 单体,可以进行服务器设置、配置和维护任务调度。它坏了,因为它太大了。参数只是无缘无故地通过函数进入彼此的位置,我们使用 LLVM 的静态分析工具来验证写入的数据流。在 5400 行之后,它会自行分崩离析。我们正在将其分解为多个小脚本。
    • 同意。该示例明确说明它将在C:\Scripts 文件夹中创建一个名为Windows PowerShell 的新文件夹。
    • @andyb 进一步看我同意你和(现在已删除)其他评论,尽管我认为这只会进一步说明位置参数可能会令人困惑。我已经编辑澄清。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2017-11-06
    • 2016-05-27
    相关资源
    最近更新 更多