如何将字符串变量与反斜杠连接起来以在 Powershell 中创建 UNC 路径
How to concatenate string variables with backslashes to create a UNC path in Powershell
这看起来应该是一件小事
我正在使用 Powershell v5.1,我正在尝试从代表服务器和共享的 2 个字符串构建 UNC 路径。假设 $Server 持有 "Distribution" 而 $Share 持有 "Publish"...
$Path = "\" + $Server + "\" + $Share
我为 $Path 得到的输出是..
\Distribution Publish\
我尝试将其更改为...
$Path = "//" + $Server + "/" + $Share
...作为一个测试,认为特殊字符“\”导致了问题,但后来我仍然得到奇怪的序列,其中服务器和共享之间有一个 space,第二个斜杠位于结束。
//Distribution Publish/
我错过了什么?
如评论中所述,如果您的 $Server
和 $Share
变量确实包含 just Distribution
和 [,则无法解释您的症状=15=],分别带有 无隐藏控制字符 .
这是一个确实会产生您的症状的变量值的人为示例:
> $Server = 'Distribution', 'Publish'; $Share = "`r"; "\" + $Server + "\" + $Share
\Distribution Publish\
正如 James C. 指出的那样,构建字符串的更简洁的替代方法是:"\$Server$Share"
.
正如 TheIncorrigible1 指出的那样,最好使用 Join-Path
.
构建路径
'Distribution', 'Publish'
是一个 数组 字符串,其元素 PowerShell 与 space(默认情况下)将其转换为字符串时,在本例中会导致 Distribution Publish
.
"`r"
创建控制字符 CR (0xD
),打印到控制台时,将光标位置重置为第一列并在那里打印字符串的其余部分(在本例中为空)。
但是请注意,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 元素 array,其元素分别是 $Server
和 $Share
的值。
为了避免这个陷阱,PowerShell 提供了严格模式设置 Set-StrictMode -Version 2
,它会在尝试方法式调用时报告错误。但是请注意,此设置也总是会启用其他检查,特别是在引用不存在的属性时会导致错误 - 请参阅 Get-Help Set-StrictMode
.
避免像处理路径时那样添加字符串;有处理该问题的 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
这看起来应该是一件小事
我正在使用 Powershell v5.1,我正在尝试从代表服务器和共享的 2 个字符串构建 UNC 路径。假设 $Server 持有 "Distribution" 而 $Share 持有 "Publish"...
$Path = "\" + $Server + "\" + $Share
我为 $Path 得到的输出是..
\Distribution Publish\
我尝试将其更改为...
$Path = "//" + $Server + "/" + $Share
...作为一个测试,认为特殊字符“\”导致了问题,但后来我仍然得到奇怪的序列,其中服务器和共享之间有一个 space,第二个斜杠位于结束。
//Distribution Publish/
我错过了什么?
如评论中所述,如果您的 $Server
和 $Share
变量确实包含 just Distribution
和 [,则无法解释您的症状=15=],分别带有 无隐藏控制字符 .
这是一个确实会产生您的症状的变量值的人为示例:
> $Server = 'Distribution', 'Publish'; $Share = "`r"; "\" + $Server + "\" + $Share
\Distribution Publish\
正如 James C. 指出的那样,构建字符串的更简洁的替代方法是:"\$Server$Share"
.
正如 TheIncorrigible1 指出的那样,最好使用 Join-Path
.
'Distribution', 'Publish'
是一个 数组 字符串,其元素 PowerShell 与 space(默认情况下)将其转换为字符串时,在本例中会导致Distribution Publish
."`r"
创建控制字符 CR (0xD
),打印到控制台时,将光标位置重置为第一列并在那里打印字符串的其余部分(在本例中为空)。
但是请注意,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 元素 array,其元素分别是 $Server
和 $Share
的值。
为了避免这个陷阱,PowerShell 提供了严格模式设置 Set-StrictMode -Version 2
,它会在尝试方法式调用时报告错误。但是请注意,此设置也总是会启用其他检查,特别是在引用不存在的属性时会导致错误 - 请参阅 Get-Help Set-StrictMode
.
避免像处理路径时那样添加字符串;有处理该问题的 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