小编use*_*092的帖子

如何使用Invoke-WebRequest的GET方法来构建查询字符串

有没有一种标准方法可以使用PowerShell中的Invoke-WebRequest或Invoke-RestMethod来使用查询字符串从网页获取信息?

例如,我知道使用格式良好的JSON端点时,以下内容将起作用:

$Parameters = @{
  Name = 'John'
  Children = 'Abe','Karen','Jo'
}
$Result = Invoke-WebRequest -Uri 'http://.....whatever' -Body ( $Parameters | ConvertTo-Json)  -ContentType application/json -Method Get
Run Code Online (Sandbox Code Playgroud)

以及等效的Invoke-WebMethod.其中一个重要方面是内容类型和ConvertTo-JSON,它管理-Body部分中指定的参数到标准形式的转换,包括"Children"字段的数组方面.

有一个等效的方法是使用一个网站,例如,使用逗号分隔的约定来管理URL中的数组参数或方法,如"Children [] = Abe&Children [] = Karen&Children = Jo"?

是否有我缺少的内容类型,并且有一个等价的ConvertTo- ?? 我可以用吗?我的猜测是有人不得不这样做.

对于上下文,这是一种在URL中编码数组参数的常用方法,常见于PHP网站.

将数组作为url参数传递

编辑 删除对PHP的引用,但特定上下文除外,并调整标题以引用查询字符串.问题是关于编码查询字符串而不是PHP本身.

arrays powershell json

8
推荐指数
1
解决办法
2万
查看次数

相当于 UNIX diff 和 patch 的本机 PowerShell

我需要潜在地修补文件作为脚本的一部分。

为了使脚本所做的事情更具可读性,我想以类似于 UNIX“diff”和“patch”方法的方式来实现它。在标准 UNIX 系统上 diff 可以生成特殊格式的文本文件,表示两个文件之间的差异。这可以与要修改的文件一起被“补丁”消耗,以便以干净且直接的方式生成更改的文件。

看来在 PowerShell 中没有直接的方法可以做到这一点。我见过的选项是使用多行正则表达式 - 这很难构建和解释,使用整个文件并逐行处理它,或者将我想要在脚本中包含的新文件编码为 Base64 字符串,只需将其解码为目标文件即可。

虽然 Compare-Object 看起来好像可以做一些事情来生成适当的 diff 对象,但似乎没有简单的方法可以使用 Compare-Object 的输出将更改应用于字符串数组。

unix powershell

6
推荐指数
1
解决办法
4605
查看次数

用于缓冲管道输入到PowerShell cmdlet的设计模式

我偶尔会遇到这样的情况,即支持将管道输入到Cmdlet,但是我希望执行的操作(例如,数据库访问)对大量的对象有意义。

实现此目的的典型方法如下所示:

function BufferExample {
<#
.SYNOPSIS
Example of filling and using an intermediate buffer.
#>
[CmdletBinding()]
param(
    [Parameter(ValueFromPipeline)]
    $InputObject
)

BEGIN {
    $Buffer = New-Object System.Collections.ArrayList(10)
    function _PROCESS {
        # Do something with a batch of items here.
        Write-Output "Element 1 of the batch is $($Buffer[1])"
        # This could be a high latency operation such as a DB call where we 
        # retrieve a set of rows by primary key rather than each one individually.

        # Then empty the …
Run Code Online (Sandbox Code Playgroud)

powershell design-patterns

5
推荐指数
1
解决办法
313
查看次数

ConfigurationProperty的典型示例

我正在尝试使用.NET配置并了解自定义部分,元素等.

似乎实现这些自定义部分需要显式声明getter和setter,通常会导致代码膨胀.

例如这里:

http://msdn.microsoft.com/en-us/library/2tw134k3.aspx

具体来说,我们似乎有必要在get和set方法中显式返回和设置内容.

// Create a "remoteOnly" attribute.
[ConfigurationProperty("remoteOnly", DefaultValue = "false", IsRequired = false)]
public Boolean RemoteOnly
{
  get
  { 
    return (Boolean)this["remoteOnly"]; 
  }
  set
  { 
    this["remoteOnly"] = value; 
  }
}
Run Code Online (Sandbox Code Playgroud)

有以下几点

[ConfigurationProperty("remoteOnly", DefaultValue = "false", IsRequired = false)]
public Boolean RemoteOnly { get; set }
Run Code Online (Sandbox Code Playgroud)

不等同于上述.

这是真的吗 - 即使有这样的香草属性,我们也必须冗长吗?

.net c#

3
推荐指数
1
解决办法
5319
查看次数

PowerShell:具有验证的GetNewClosure()和Cmdlet

我试图了解.GetNewClosure()如何在PowerShell 2中的脚本cmdlet上下文中工作。

本质上,我有一个返回像这样的对象的函数:

function Get-AnObject {
param(
    [CmdletBinding()]
    [Parameter(....)]
    [String[]]$Id
    ..
    [ValidateSet('Option1','Option2')]
    [String[]]$Options
)

...

    $T = New-Object PSCustomObject -Property @{ ..... } 
    $T | Add-Member -MemberType ScriptProperty -Name ExpensiveScriptProperty -Value {
        $this | Get-ExpensiveStuff
    }.GetNewClosure() 

..
}
Run Code Online (Sandbox Code Playgroud)

如果我没有验证集选项,那么关闭似乎可以正常工作。如果包含它,则新的关闭失败并显示以下错误。

“使用” 0“参数调用” GetNewClosure“的异常:”无法添加属性,因为这将导致带有值的变量Options变得无效。“

大概闭包正在尝试捕获对Cmdlet的调用的上下文。由于参数“ Options”根本没有绑定,因此在参数验证中效果不佳。

我想可以通过将验证作为代码放置在Cmdlet的正文中而不是使用[Validate *()]装饰器来避免这种情况,但这似乎很讨厌并且晦涩难懂。有没有办法融合这两个想法?

validation powershell closures cmdlet powershell-2.0

3
推荐指数
1
解决办法
550
查看次数