我正在制作一个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
有谁知道,为什么会这样?切换到发布模式没有帮助。
答案 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"
)
因此我们可以在参数中给出值,在发布版本中删除其他不需要的参数。