与原型相关的注意事项被接受并且尽管如此,下面两个设计的子实体可以存在于同一个包中,即提供可选的块参数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) 考虑以下任意函数和测试用例:
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到运行过滤器时, …
Write-Host在可以针对任何合理主机实现运行的脚本中,是否有任何理智、可靠的契约指示在给定的 PowerShell 主机实现中是否受支持?
(假设我理解Write-Host和Write-Output/之间的区别,并且Write-Verbose我确实需要Write-Host语义,如果支持的话,对于这个特定的人类可读文本。)
我想尝试询问$Host变量,或$Host.UI/$Host.UI.RawUI但我发现的唯一相关差异是:
在$Host.Name:
$Host.Name = 'ConsoleHost'$Host.Name = 'Windows PowerShell ISE Host'$Host.Name = 'Default Host'在$Host.UI.RawUI:
$Host.UI.RawUI$null对于 的某些属性,ISE 不返回任何值(或)$Host.UI.RawUI,例如$Host.UI.RawUI.CursorSize$Host.UI.RawUI维护一个$Host.Name支持的值列表Write-Host似乎有点负担,尤其是现在 PowerShell 是跨平台的。我合理地希望脚本能够从任何主机调用,并且只做正确的事情。
我编写了一个脚本,可以从 PowerShell 命令提示符、ISE 或 SQL …
我有一个生成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问题?有修复吗?我认为持久性处理程序可能在注册表中丢失或错误注册,但我不知道要添加什么...
考虑以下人为的例子:
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
closures ×1
excel ×1
function ×1
perl ×1
scope ×1
scriptblock ×1
vbscript ×1
write-host ×1
xml ×1