有没有一种标准方法可以使用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网站.
编辑 删除对PHP的引用,但特定上下文除外,并调整标题以引用查询字符串.问题是关于编码查询字符串而不是PHP本身.
我需要潜在地修补文件作为脚本的一部分。
为了使脚本所做的事情更具可读性,我想以类似于 UNIX“diff”和“patch”方法的方式来实现它。在标准 UNIX 系统上 diff 可以生成特殊格式的文本文件,表示两个文件之间的差异。这可以与要修改的文件一起被“补丁”消耗,以便以干净且直接的方式生成更改的文件。
看来在 PowerShell 中没有直接的方法可以做到这一点。我见过的选项是使用多行正则表达式 - 这很难构建和解释,使用整个文件并逐行处理它,或者将我想要在脚本中包含的新文件编码为 Base64 字符串,只需将其解码为目标文件即可。
虽然 Compare-Object 看起来好像可以做一些事情来生成适当的 diff 对象,但似乎没有简单的方法可以使用 Compare-Object 的输出将更改应用于字符串数组。
我偶尔会遇到这样的情况,即支持将管道输入到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) 我正在尝试使用.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)
不等同于上述.
这是真的吗 - 即使有这样的香草属性,我们也必须冗长吗?
我试图了解.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 *()]装饰器来避免这种情况,但这似乎很讨厌并且晦涩难懂。有没有办法融合这两个想法?