使用 Powershell 替换将字符插入 UNC 字符串

Posted

技术标签:

【中文标题】使用 Powershell 替换将字符插入 UNC 字符串【英文标题】:Insert character into UNC string using Powershell replace 【发布时间】:2016-11-29 10:38:36 【问题描述】:

我们一直在将多个文件服务器迁移到一个整合的黑盒解决方案中,并且有理由将某些文件从原始源服务器复制回新解决方案,因为从存档中召回这些文件时出现了一些问题(即不常用的文件)。

我已经开始编写代码来识别文件

$v7Kitems = Get-ChildItem $parentpath -force | where $_.attributes -match "Offline" | Select FullName, DirectoryName

它为我将信息放入一个数组中。 UNC 的格式为\\new_server\adminshare\old_server\original_drive\original_local_directory_structure\file

我希望使用替换选项为旧文件位置创建一个新变量,然后使用 Get-Item 将文件复制回来,因此也拉回了“DirectoryName”。

Foreach($item in $v7Kitems)
    $source=$item.FullName -replace "\\\\new_server\\adminshare\\","\\" -replace "\\[E-Z]\\","\<original_drive>$\"

我不知道应该在 \\[E-Z]\\ 的替换部分中使用什么,因为驱动器号在服务器之间不一致。到此为止的字符串长度是一致的长度。也许我不应该使用正则表达式替换,而是使用其他类型来捕获驱动器号字符处的字母,然后将其作为变量插入到替换字符串中?

溢出神谕的想法是什么?

杰夫

【问题讨论】:

-replace '\\([e-z])\\','\$1$\' 感谢您的建议。我已经尝试过更改,这会将输出更改为\\old_server\$\original_local_directory_structure\file,它没有驱动器号。我是否应该尝试将驱动器号捕获为变量$1 我可能会解决我自己的问题,但Foreach($item in $v7Kitems) $uncsplit = $item.FullName.split("\") $drive = $uncsplit[5] $source=$item.FullName -replace "\\\\new_server\\adminshare\\","\\" -replace "\\([e-z])\\","\$drive$\" 似乎给出了正确的输出。如果路径构造是预期的且一致的,是否有任何理由不应该工作? 输入字符串中的驱动器号在哪里?如果丢失,驱动器号只能在替换中硬编码。 @Geoff 您在替换表达式 ("\$1$\") 周围使用了双引号。请再看一下 Mathias 的评论,并注意那里使用的引号。如果您要使用双引号,则需要使用反引号转义 $ 中的 $1 【参考方案1】:

正如Mathias 在他的评论中指出的那样,您需要将驱动器号匹配放在捕获组中,这样您就可以将其替换为对匹配的反向引用,后跟$ 字符:

-replace '\\([e-z])\\','\$1$\'

请注意,替换表达式周围需要单引号,否则 PowerShell 会在正则表达式引擎看到替换字符串之前将 $1 扩展为(空)PowerShell 变量。

【讨论】:

以上是关于使用 Powershell 替换将字符插入 UNC 字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 PowerShell 和 UNC 路径进行 NMAKE clean

无法访问 Powershell 远程会话中的 UNC 路径

Azure 函数 - Powershell 和 Azure 存储表(插入或替换)

在 .bat 文件中使用 PowerShell,将一个字符串替换为多个字符串

Powershell:如何将字符串中的第一个“:”替换为“,”?

如何在 PowerShell 函数中进行字符串替换?