Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 将UNC路径转换为NTFS本地路径_Powershell_Powershell 3.0 - Fatal编程技术网

Powershell 将UNC路径转换为NTFS本地路径

Powershell 将UNC路径转换为NTFS本地路径,powershell,powershell-3.0,Powershell,Powershell 3.0,在powershell中将UNC位置转换为本地驱动器时遇到问题。所以我的代码基本上是将用户作为读取主机的输入作为DB备份位置的UNC路径。位置可以是这样的\\ServerName\m$\SQLBackups\123 然后,它会提示从何处复制备份。这也是一个UNC路径,例如\\ServerName\g$\SQLRestores\444\Filename.bak 我需要将这两个路径都转换为它们的本地路径,以便它读取m:\sqldbackups\123和g:\sqlrestores\444\Filen

在powershell中将UNC位置转换为本地驱动器时遇到问题。所以我的代码基本上是将用户作为读取主机的输入作为DB备份位置的UNC路径。位置可以是这样的
\\ServerName\m$\SQLBackups\123

然后,它会提示从何处复制备份。这也是一个UNC路径,例如
\\ServerName\g$\SQLRestores\444\Filename.bak

我需要将这两个路径都转换为它们的本地路径,以便它读取
m:\sqldbackups\123
g:\sqlrestores\444\Filename.bak

下面是我的代码,我添加了一条注释,说明了我希望最终输出的内容

$BackupPath = "\\ServerName\m$\SQLBackups\123"
$Dumps = Split-Path -Path $BackupPath -Leaf
$Drive = Split-Path -Path $BackupPath -Parent
$LastTwo = $Drive.Substring($Drive.get_Length()-2)


$FullNTFS = $LastTwo + "\" + $Dumps
$FullNTFS = $FullNTFS.Replace("$",":")
$FullNTFS 
#This should be M:\SQLBACKUPS\123

$RestorePath = "\\ServerName\g$\SQLRestores\444\Filename.bak"
$Dumps = Split-Path -Path $RestorePath -Leaf
$Drive = Split-Path -Path $RestorePath -Parent
$LastTwo = $Drive.Substring($Drive.get_Length()-2)


$FullNTFS = $LastTwo + "\" + $Dumps
$FullNTFS = $FullNTFS.Replace("$",":")
$FullNTFS 
#This should be read as g:\sqlrestores\444\FileName.bak

Split Path
除非路径指向共享根目录或文件,否则无法工作

改为使用以获取主机名和共享名:

$Drive = [System.IO.Path]::GetPathRoot($BackupPath)
$Dumps = $BackupPath.Substring($Drive.Length)
$Drive = $Drive.Substring($Drive.LastIndexOf('\') + 1).Replace('$',':')
$NTFSPath = "$Drive$Dumps"

我认为上面的答案是正确的,但有时简单的模式匹配可能就足够了:

"\\server2.net\g$\foo\bar\baz", "\\server1.com\c$\baz\bar\foo" |
Select-String -Pattern "([A-z])\`$(.*)" |
%{ "$($_.Matches.Groups[1].value):$($_.Matches.Groups[2].value)" }

这真是一个很好的方法!我还想在驱动器号中添加
ToUpper()
,但这只是虚荣:)正是我想要的。非常感谢。为了获得文件名,我做了$FileName=拆分路径$BackupPath-leaf
# -replace operator with regex does the trick
PS C:\> '\\ServerName\m$\SQLBackups\123' -replace '(?:.+)\\([a-z])\$\\','$1:\'
m:\SQLBackups\123