这似乎应该是一件微不足道的事情。
我正在使用Powershell v5.1,我正在尝试从代表服务器和共享的2个字符串构建UNC路径。鉴于$ Server持有“Distribution”而$ Share持有“Publish”......
$Path = "\\" + $Server + "\" + $Share
我获得$ Path的输出是..
\\Distribution Publish\
我尝试将其更改为...
$Path = "//" + $Server + "/" + $Share
...作为测试,认为特殊字符“\”导致了问题,但是我仍然得到奇怪的序列,其中服务器和共享之间有空格,第二个斜杠在最后。
//Distribution Publish/
我错过了什么?
答案 0 :(得分:4)
如评论中所述,如果您的$Server
和$Share
变量真正包含 Distribution
和Publish
,则无法解释您的症状,分别用没有隐藏的控制字符。
这是一个可以产生症状的变量值的人为例子:
> $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