2016-07-26 2 views
0

私はPowerShellスクリプトを作成しています。私はVisual Studio 2015で何か変わったことがありました。sciriptのパラメータに値を代入しようとすると、空白になります。しかし、クリーンなパワーシェルコンソールでは、すべてが大丈夫です。ここに私のコードがある、とVSときれいなPSの結果:PS - Visual Studioのパラメータのデフォルト値2015

[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

私は自分で答えを見つけました。

主な問題は、何らかの種類の「仮想コンテナ」を使用してコードを実行し、そのために特別に作成されたコードで、一部の組み込みパラメータを正しい値で初期化できないということです。存在しない。この場合

私は$ PSScriptRoot変数の値を取得しようとすると、スクリプトが存在しないディレクトリから実行されているので、それは、何も返しません。そして、クリーンPowerShellコンソールでは、実行は次のようになります。

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

だから、スクリプトが値を持っているこの「仮想コンテナ」からが、指定されたディレクトリから実行している、と$ PSScriptRootされていません。

このため、このようなスクリプトのデバッグに問題があります。

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

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

これは、例外やエラーの多くを返します。私の知る限りでは、あなたはパラメータをチェックするために、ブロックの前に$ PSScriptRootはそのような価値を持っている場合は、if文のブロックを追加することはできません。

私は、このための解決策を見つけた:

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

だから我々は単にパラメータの値を与える、とリリースバージョンで追加の不要なパラメータを削除することができます。