如何使用反斜杠连接字符串变量以在Powershell中创建UNC路径

时间:2017-07-27 12:45:54

标签: powershell powershell-v4.0

这似乎应该是一件微不足道的事情。

我正在使用Powershell v5.1,我正在尝试从代表服务器和共享的2个字符串构建UNC路径。鉴于$ Server持有“Distribution”而$ Share持有“Publish”......

 $Path = "\\" + $Server + "\" + $Share

我获得$ Path的输出是..

\\Distribution Publish\

我尝试将其更改为...

$Path = "//" + $Server + "/" + $Share

...作为测试,认为特殊字符“\”导致了问题,但是我仍然得到奇怪的序列,其中服务器和共享之间有空格,第二个斜杠在最后。

//Distribution Publish/

我错过了什么?

2 个答案:

答案 0 :(得分:4)

如评论中所述,如果您的$Server$Share变量真正包含 DistributionPublish,则无法解释您的症状,分别用没有隐藏的控制字符

这是一个可以产生症状的变量值的人为例子:

> $Server = 'Distribution', 'Publish'; $Share = "`r"; "\\" + $Server + "\" + $Share
\\Distribution Publish\

正如James C.所指出的,构建字符串的更简洁的替代方法是:"\\$Server\$Share"
正如TheIncorrigible1指出的那样,最好使用Join-Path构建路径。

  • 'Distribution', 'Publish'是一个数组字符串,其元素PowerShell 与空格连接(默认情况下)将其转换为字符串时在这种情况下会产生Distribution Publish

  • "`r"创建控制字符CR(0xD),在打印到控制台时,将光标位置重置为第一列< / em>并在那里打印字符串的剩余部分(在这种情况下为空) 但请注意,CR仍然是字符串的一部分,尽管是不可见的 如果您想要一种简单的方法来检查给定字符串中的隐藏控制字符,请参阅我的this answer

<强>更新

OP报告说,$Server$Share变量是如何通过参数绑定的,通过错误地使用(C#)方法 - 调用语法

# Correct invocation: $Server binds to 1st parameter, $Share to 2nd.
./script $Server $Share

# INCORRECT: Binds *both* values to the *first* parameter, as an *array*
#            and assigns nothing to the second.
#            In PowerShell, "," constructs an array.
./script($Server, $Share) 

棘手的是./script($Server, $Share)恰好也是有效的PowerShell语法,只有不同的语义:$Server, $Share构造一个2元素数组,其元素是分别为$Server$Share

为了避免这种缺陷,PowerShell提供了严格模式设置Set-StrictMode -Version 2,它在尝试进行方法样式调用时报告错误。但请注意,此设置总是会启用其他检查,特别是在引用不存在的属性时会导致错误 - 请参阅Get-Help Set-StrictMode

答案 1 :(得分:1)

在使用路径时,请避免使用像你一样的字符串添加;有处理它的cmdlet。

$Server = '\\This.server.name'
$File = 'something.exe'
$UNC = Join-Path $Server $File

此外,如果您遇到奇怪的错误,请进行字符串验证。

If (!$Server) { "Stuff"; Return } # Checks empty string
If (!$File)   { "Stuff"; Return }
If (!(Test-Path $UNC)) { "Stuff"; Return } # error checking for the file