我有一个大批量脚本,它设置了一堆环境变量.我想调用批处理脚本从PowerShell中,这样,我可以让我的脚本和PowerShell设置这两个即enviorment变量的好处.
PowerShell 3.0 CTP1引入了一个新功能[ordered],它有点像OrderedDictionary.我无法想象它的实际用例.为什么这个功能真的有用?有人可以提供一些有用的例子吗?
例如:这是,恕我直言,而不是实际的演示案例:
$a = [ordered]@{a=1;b=2;d=3;c=4}
Run Code Online (Sandbox Code Playgroud)
(我不介意它是否仍然有用,那我只是在寻找其他有用的案例).
我不是在寻找用例OrderedDictionary,确实很有用.但我们可以直接在v2.0中使用它(我做了很多).我试图理解为什么还[ordered]需要这个新功能.
$hash = [ordered]@{}
Run Code Online (Sandbox Code Playgroud)
比...短
$hash = New-Object System.Collections.Specialized.OrderedDictionary
Run Code Online (Sandbox Code Playgroud)
NB ordered不是该类型的真正捷径.New-Object ordered不起作用.
注2:但这仍然是一个很好的捷径,因为(我认为,不能尝试)它创建典型的PowerShell不区分大小写的字典.v2.0中的等效命令实际上太长了:
New-Object System.Collections.Specialized.OrderedDictionary]([System.StringComparer]::OrdinalIgnoreCase)
Run Code Online (Sandbox Code Playgroud) 如何做一个cmdlet的知道什么时候真的应该叫WriteVerbose(),
WriteDebug()等?
也许我想念一些简单的东西,但我找不到答案.到目前为止我见过的所有cmdlet实现都WriteVerbose()没有任何犹豫.我知道这样做是正确的,但它没有效果.
当详细模式关闭但cmdlet仍然为WriteVerbose()调用准备数据时,性能会受到影响,即无需任何操作.
换句话说,在cmdlet中我希望能够:
if (<VerboseMode>)
{
.... data preparation, sometimes expensive ...
WriteVerbose(...);
}
Run Code Online (Sandbox Code Playgroud)
但我不知道怎么做到这一点if (<VerboseMode>).有任何想法吗?
结论: @ stej的答案显示了如何在理论上获得所需的信息.在实践中,这是hacky并且不太可能合适.因此,如果cmdlet产生非常昂贵的详细或调试输出,那么引入指定详细级别的附加参数似乎是合理的.
我正在尝试使用DbConnectionStringBuilder解析类似连接字符串的用户输入的功能.这在C#中运行得很好:
using System;
using System.Data.Common;
class Program
{
static void Main(string[] args)
{
var sb = new DbConnectionStringBuilder();
sb.ConnectionString = "server = 'smtp.gmail.com'; port = 587; user = you@gmail.com";
Console.WriteLine(sb["server"]);
Console.WriteLine(sb["port"]);
Console.WriteLine(sb["user"]);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
smtp.gmail.com
587
you@gmail.com
Run Code Online (Sandbox Code Playgroud)
但它在PowerShell中不起作用.也就是说,这是PowerShell中的字面翻译代码
$sb = New-Object System.Data.Common.DbConnectionStringBuilder
$sb.ConnectionString = "server = 'smtp.gmail.com'; port = 587; user = you@gmail.com"
$sb["server"]
$sb["port"]
$sb["user"]
Run Code Online (Sandbox Code Playgroud)
根本不产生输出.
有什么想法吗?如何DbConnectionStringBuilder在PowerShell中作为解析器工作?
以下是演示此问题的代码.如果提供者是,则cmdlet Set-Location具有动态切换.ReadOnlyFileSystem
# provider that does not have the dynamic -ReadOnly
Set-Location env:
# case 1: works because we explicitly specify FileSystem
Get-ChildItem C:\ -ReadOnly
# case 2: fails even though we explicitly specify FileSystem
Get-ChildItem -ReadOnly C:\
Run Code Online (Sandbox Code Playgroud)
通常,命令中的开关参数的位置无关紧要.这不是动态切换的情况.案例2失败并出现错误:
Get-ChildItem : A parameter cannot be found that matches parameter name 'ReadOnly'.
Run Code Online (Sandbox Code Playgroud)
怎么了?我认为在动态参数创建的那一刻,还不知道ReadOnly是开关.因此,PowerShell将它作为它的参数规则的参数C:\和C:\因此不被视为一个位置参数.因此,Get-ChildItem认为未指定位置并使用当前位置env:.提供程序Environment不提供动态切换ReadOnly,因此最终命令因语法不正确而失败,即使它有些正确(如果当前提供程序是相同的命令,则相同的命令FileSystem).
问题:
最后一个问题是关于使用动态参数开发的用户命令的更多信息.该问题最初被注意到并描述为Invoke-Build Issue#4.目前,这个问题只是记录在案.但我仍然对解决方法感兴趣. …
在调查某些问题时,我发现原因是看似相同的输入数据的字符串[]的意外不同转换.也就是说,在下面的代码中,两个命令都返回相同的两个项File1.txt和File2.txt.但转换为string []会产生不同的结果,请参阅注释.
任何想法为什么呢?这可能是一个错误.如果有人也这么认为,我会提交.但是,了解正在发生的事情并避免陷阱就好了.
# *** WARNING
# *** Make sure you do not have anything in C:\TEMP\Test
# *** The code creates C:\TEMP\Test with File1.txt, File2.txt
# Make C:\TEMP\Test and two test files
$null = mkdir C:\TEMP\Test -Force
1 | Set-Content C:\TEMP\Test\File1.txt
1 | Set-Content C:\TEMP\Test\File2.txt
# This gets just file names
[string[]](Get-ChildItem C:\TEMP\Test)
# This gets full file paths
[string[]](Get-ChildItem C:\TEMP\Test -Include *)
# Output:
# File1.txt
# File2.txt
# C:\TEMP\Test\File1.txt
# C:\TEMP\Test\File2.txt
Run Code Online (Sandbox Code Playgroud) 如何从覆盖方法中的计算表达式调用基本 F# 方法?
这是这个令人惊讶的问题的一些人为例子。不要问我为什么需要这个特定的场景,实际用例更有意义,但很难表示。特别是,async无关紧要,在实际情况下,我使用不同的计算表达式,甚至不需要 bang ( !) 来调用基本方法。但症状是一样的。
// Base class with a virtual method
type T1 () =
abstract Test : unit -> Async<unit>
default _.Test () =
async {
printfn "In test"
}
// Derived class with an overridden method calling the base in a computation expression
type T2 () =
inherit T1 ()
override _.Test () =
async {
do! base.Test ()
}
let t2 = T2 ()
t2.Test () |> Async.RunSynchronously
Run Code Online (Sandbox Code Playgroud)
上面的代码无法编译:
error …Run Code Online (Sandbox Code Playgroud)