小编jim*_*gee的帖子

采用可选块参数的子例程

与原型相关的注意事项被接受并且尽管如此,下面两个设计的子实体可以存在于同一个包中,即提供可选的块参数sort吗?

sub myprint {
   for (@_) {
       print "$_\n";
   }
}
sub myprint (&@) {
   my $block = shift;
   for (@_) {
       print $block->() . "\n";
   }
}
Run Code Online (Sandbox Code Playgroud)

意图是提供类似的调用约定sort,例如允许执行:

my @x = qw(foo bar baz);
print_list @x;

# foo
# bar
# baz
Run Code Online (Sandbox Code Playgroud)

...和:

my @y = ( {a=>'foo'}, {a=>'bar'}, {a=>'baz'} );
print_list { $_->{a} } @y;

# foo
# bar
# baz
Run Code Online (Sandbox Code Playgroud)

如果我尝试(这是合理的),我会重新定义和/或原型不匹配警告.

我想我能做到:

sub myprint {
   my $block = undef;
   $block = shift if …
Run Code Online (Sandbox Code Playgroud)

perl subroutine-prototypes

9
推荐指数
1
解决办法
208
查看次数

支持词法范围的ScriptBlock参数(例如Where-Object)

考虑以下任意函数和测试用例:

Function Foo-MyBar {
    Param(
        [Parameter(Mandatory=$false)]
        [ScriptBlock] $Filter
    )

    if (!$Filter) { 
        $Filter = { $true } 
    }

    #$Filter = $Filter.GetNewClosure()

    Get-ChildItem "$env:SYSTEMROOT" | Where-Object $Filter   
}

##################################

$private:pattern = 'T*'

Get-Help Foo-MyBar -Detailed

Write-Host "`n`nUnfiltered..."
Foo-MyBar

Write-Host "`n`nTest 1:. Piped through Where-Object..."
Foo-MyBar | Where-Object { $_.Name -ilike $private:pattern  }

Write-Host "`n`nTest 2:. Supplied a naiive -Filter parameter"
Foo-MyBar -Filter { $_.Name -ilike $private:pattern }
Run Code Online (Sandbox Code Playgroud)

在测试1中,我们Foo-MyBar通过Where-Object过滤器管道结果,该过滤器将返回的对象与包含在私有范围变量中的模式进行比较$private:pattern.在这种情况下,这将正确返回C:\中以字母开头的所有文件/文件夹T.

在测试2中,我们直接将相同的过滤脚本作为参数传递给Foo-MyBar.但是,Foo-MyBar到运行过滤器时, …

powershell closures scope function scriptblock

6
推荐指数
2
解决办法
176
查看次数

如何确定 Write-Host 是否适用于当前主机

Write-Host在可以针对任何合理主机实现运行的脚本中,是否有任何理智、可靠的契约指示在给定的 PowerShell 主机实现中是否受支持?

(假设我理解Write-HostWrite-Output/之间的区别,并且Write-Verbose我确实需要Write-Host语义,如果支持的话,对于这个特定的人类可读文本。)

我想尝试询问$Host变量,或$Host.UI/$Host.UI.RawUI但我发现的唯一相关差异是:

  • $Host.Name

    • Windows powershell.exe 命令行具有 $Host.Name = 'ConsoleHost'
    • ISE有 $Host.Name = 'Windows PowerShell ISE Host'
    • SQL Server 代理作业步骤有 $Host.Name = 'Default Host'
    • 我没有安装任何非 Windows 版本,但我希望它们有所不同
  • $Host.UI.RawUI

    • Windows powershell.exe 命令行返回所有属性的值 $Host.UI.RawUI
    • $null对于 的某些属性,ISE 不返回任何值(或)$Host.UI.RawUI,例如$Host.UI.RawUI.CursorSize
    • SQL Server 代理作业步骤不返回所有值 $Host.UI.RawUI
    • 再一次,我无法签入任何其他平台

维护一个$Host.Name支持的值列表Write-Host似乎有点负担,尤其是现在 PowerShell 是跨平台的。我合理地希望脚本能够从任何主机调用,并且只做正确的事情

背景

我编写了一个脚本,可以从 PowerShell 命令提示符、ISE 或 SQL …

powershell powershell-hosting write-host

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

Excel 2003 XML格式不能在Excel 2010 x64中自动打开

我有一个生成Excel文件的vbscript,采用旧式的Excel XML Spreadsheet 2003格式.它包含了必要的处理指令(即<?mso-application progid="Excel.Sheet"?>标签)和我的用户可以在Office 2003和Office 2007(XP系统上运行)来打开它们,通过双击该附件.

我们现在正在使用Office 2010 x64测试Windows 7 x64的桌面版本,这不再适用.这些文件只是在IE中打开并显示基础XML.如果文件保存到桌面,它仍然会在图标上显示Excel标志,但仍会在IE中打开.

这是64位问题还是Excel 2010问题?有修复吗?我认为持久性处理程序可能在注册表中丢失或错误注册,但我不知道要添加什么...

xml vbscript excel

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

$PSCmdlet.ShouldProcess 状态在调用之间存储在哪里(以及如何重置)?

考虑以下人为的例子:

function Test-ProcessContinue {
    [CmdletBinding(SupportsShouldProcess=$true, ConfirmImpact='High')]
    Param()

    for ($i = 1; $i -le 3; $i++) {
        if ($PSCmdlet.ShouldProcess("$i", "Process")) {
            Write-Output "Processing $i"
        }
        else {
            Write-Verbose "No chosen"
        }
    }

    for ($i = 1; $i -le 3; $i++) {
        if ($PSCmdlet.ShouldProcess("$i", "Process")) {
            Write-Output "Processing $i"
        }
        else {
            Write-Verbose "No chosen"
        }
    }

    $yta = $false; $nta = $false
    for ($i = 1; $i -le 3; $i++) {
        if ($PSCmdlet.ShouldContinue("$i", "Continue", [ref]$yta, [ref]$nta) -or $yta) {
            Write-Output "Continuing …
Run Code Online (Sandbox Code Playgroud)

powershell

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