2017-07-27 49 views
1

這看起來應該是件小事。如何使用反斜槓連接字符串變量以在Powershell中創建UNC路徑

我使用Powershell v5.1,我試圖從代表服務器和共享的2個字符串構建UNC路徑。考慮到$服務器保持「分配」和$共享持有「發佈」 ...

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

我得到了$路徑的輸出是..

\\Distribution Publish\ 

我試圖改變它.. 。

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

...作爲測試想着特殊字符「\」是造成問題,但我仍然獲得奇數序列,其中有服務器和共享以及第二斜線之間的空間是在結束。

//Distribution Publish/ 

我錯過了什麼?

+4

您確定'$ server'和'$ share'包含您的想法,而且它們實際上並不是例如'$ server ==「發佈發佈」'和'$ share ==「」' ?你有什麼[應該沒問題](https://i.stack.imgur.com/Oi6lk.png)。 –

+2

無法在PowerShell 5中重現,它確實很奇怪。檢查'$ Server.Length'和'$ Share.Length'是否包含可能影響結果的有趣的不可見字符(如RTL標記)。 –

+1

作爲雙引號內的替換函數,'$ Path =「\\ $ Server \ $ Share」'會做你想做的事。 –

回答

4

正如在評論中提到,你的症狀是無法解釋的,如果你的$Server$Share變量真正包含只是DistributionPublish,分別與沒有隱藏的控制字符

這裏的變量值的一個人爲的例子那些出示你的症狀:

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

正如詹姆斯C.指出,建設字符串更簡明的方法是:"\\$Server\$Share"。正如TheIncorrigible1指出的那樣,最好使用Join-Path構建路徑。

  • 'Distribution', 'Publish'是一個字符串數組,其元素的PowerShell 符連接用空間(默認)中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元素數組,其元素分別爲$Server$Share的值。

爲了避免這個缺陷,PowerShell提供了嚴格模式設置Set-StrictMode -Version 2,當嘗試方法式調用時會報告錯誤。但是請注意,此設置始終會啓用其他檢查,特別是在引用不存在的屬性時會導致錯誤 - 請參閱Get-Help Set-StrictMode

+0

@EiEiGuy:很高興聽到它。我懂了;是的,傳遞參數C#風格是一個常見的陷阱 - 請參閱我的更新。 – mklement0

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 
+0

我在做什麼是接受服務器名稱和共享名稱作爲我的文件複製腳本的參數,並試圖驗證目標UNC。在我調用Test-Path之前,我剝離了任何用戶提供的「\」或「/」字符,然後構建正確的\\ server \ share路徑。我會給你一個+1加入路徑,雖然 – EiEiGuy

+0

是的,'加入路徑'是很好的建議。 @TheIncorrigible1:但是,您的UNC路徑缺少_share_組件。另外,我建議不要使用'Return'來處理錯誤。 – mklement0

+0

是的,理想情況下你會使用'[CmdletBinding()]'和'$ PSCmdlet.ThrowTerminatingError()',但這是一個簡單的例子。該共享可以在'$ Server'變量中指定,或者更恰當地重命名爲'$ Share' – TheIncorrigible1

相關問題