小编Rom*_*min的帖子

如何从Powershell调用批处理脚本?

我有一个大批量脚本,它设置了一堆环境变量.我想调用批处理脚本从PowerShell中,这样,我可以让我的脚本和PowerShell设置这两个即enviorment变量的好处.

powershell batch-file

23
推荐指数
2
解决办法
4万
查看次数

脚本:在powershell中做什么?

我之前在变量上看到过这种语法,并且不完全确定它是什么:

$script:Foo = "Bar"
Run Code Online (Sandbox Code Playgroud)

powershell

14
推荐指数
2
解决办法
7375
查看次数

[ordered]的用例,新的PowerShell 3.0功能

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)

powershell powershell-3.0

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

cmdlet如何知道它何时应该调用WriteVerbose()?

如何做一个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产生非常昂贵的详细或调试输出,那么引入指定详细级别的附加参数似乎是合理的.

powershell

6
推荐指数
3
解决办法
3912
查看次数

在PowerShell中使用时,DbConnectionStringBuilder不解析

我正在尝试使用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中作为解析器工作?

powershell

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

位置参数之前的动态切换可能无法按预期工作

以下是演示此问题的代码.如果提供者是,则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.目前,这个问题只是记录在案.但我仍然对解决方法感兴趣. …

powershell invoke-build

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

神秘的不同转换为看似相同的输入数据的字符串[]

在调查某些问题时,我发现原因是看似相同的输入数据的字符串[]的意外不同转换.也就是说,在下面的代码中,两个命令都返回相同的两个项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)

powershell powershell-2.0

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

如何从覆盖方法中的计算表达式调用基本 F# 方法?

如何从覆盖方法中的计算表达式调用基本 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)

f#

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