PS - Visual Studio 2015中参数的默认值

时间:2016-07-26 16:16:12

标签: string visual-studio powershell parameters

我正在制作一个PowerShell脚本,我发现我的Visual Studio 2015发生了一些奇怪的事情。当我试图为sciript的参数赋值时,它变成了空白。但是在干净的PowerShell控制台中,一切都很好。这是我的代码,以及VS和清洁PS的结果:

[CmdletBinding()]
Param(
    [Parameter(Mandatory=$False)]
     [String]$parameter = $PSScriptRoot
)

$var = "\file.txt"
echo "PSScriptRoot: $PSScriptRoot"
echo "Parameter: $parameter"

$var1 = $PSScriptRoot + $var
$var2 = $parameter + "\file.txt"
$var3 = $parameter + $var
-Join ($parameter, $var)

echo "var1: $var1"
echo $var1.GetType()
echo "var2: $var2"
echo $var2.GetType()
echo "var3: $var3"
echo $var3.GetType()
echo "var: $var"
echo $var.GetType()
echo "parameter: $parameter"

结果VS2015:

PSScriptRoot: C:\Users\Ja\Documents\Visual Studio 2015\Projects\teststemp\teststemp
Parameter: 
\file.txt
var1: C:\Users\Ja\Documents\Visual Studio 2015\Projects\teststemp\teststemp\file.txt

IsPublic IsSerial Name                                     BaseType            
-------- -------- ----                                     --------            
True     True     String                                   System.Object       
var2: \file.txt
True     True     String                                   System.Object       
var3: \file.txt
True     True     String                                   System.Object       
var: \file.txt
True     True     String                                   System.Object       
parameter: 

结果清理PowerShell:

PSScriptRoot: C:\users\ja\documents\Visual Studio 2015\Projects\teststemp\teststemp
Parameter: C:\users\ja\documents\Visual Studio 2015\Projects\teststemp\teststemp
C:\users\ja\documents\Visual Studio 2015\Projects\teststemp\teststemp\file.txt
var1: C:\users\ja\documents\Visual Studio 2015\Projects\teststemp\teststemp\file.txt
System.String
var2: C:\users\ja\documents\Visual Studio 2015\Projects\teststemp\teststemp\file.txt
System.String
var3: C:\users\ja\documents\Visual Studio 2015\Projects\teststemp\teststemp\file.txt
System.String
var: \file.txt
System.String
parameter: C:\users\ja\documents\Visual Studio 2015\Projects\teststemp\teststemp

有谁知道,为什么会这样?切换到发布模式没有帮助。

1 个答案:

答案 0 :(得分:0)

所以我自己找到了答案。

主要问题是,任何IDE运行代码都带有某种特殊的“虚容器”,因此,某些内置参数无法使用正确的值进行初始化,因为这些值不会存在。

在这种情况下,当我尝试获取$ PSScriptRoot变量值时,它不返回任何内容,因为脚本是从不存在的目录运行的。在干净的PowerShell控制台中,执行如下:

& ("C:\Scripts\script.ps1")

因此脚本不是从这个“虚容器”运行,而是从指定的目录运行,$ PSScriptRoot现在有价值。

因此,调试这样的脚本会出现问题。据我所知,你不能在参数阻止之前添加if语句块来检查,如果$ PSScriptRoot有值,就像那样:

if ($PSScriptRoot -eq $null) {
    $PSScriptRoot = "C:\something"
}

[CmdletBinding()]
Param(
     [String]$cfgFile = $PSScriptRoot + "\cfg.txt"
)

这会返回很多异常和错误。

我找到了解决方法:

[CmdletBinding()]
    Param(
         [String]$PSScriptRoot,
         [String]$cfgFile = $PSScriptRoot + "\cfg.txt"
    )

因此我们可以在参数中给出值,在发布版本中删除其他不需要的参数。

相关问题