首页 > 解决方案 > 在powershell中添加字符串替换

问题描述

大家好,我是powershell的初学者,我有一个来自我创建的脚本的输出文件,用于检查netapp SVM(na0maa-euc01)level3文件夹上的所有卷数据(datax),该文件夹拥有每个人的权限并且没有活动目录安全性组(必须位于 level3 文件夹上),所以输出 txt 文件是这样的

\\na0maa-euc01\data1\Nissan Production Engineering\TC Facility\X11M 
\\na0maa-euc01\data1\Powertrain_DIP-A entry\IQMS\Data
\\na0maa-euc01\data1\Powertrain_DIP-A entry\PROJECT INFORMATION\Data
\\na0maa-euc01\data2\powertrain_emb_ice_algorithm_OLD\Data\05_DCM

从名为 f-typhon-old 的 7 模式 netapp 复制的 3 级文件夹是 acl 没问题

\\f-typhon-old\data1\Nissan Production Engineering.mig\TC Facility\X11M
\\f-typhon-old\data1\Powertrain_DIP-A entry.mig\IQMS\Data
\\f-typhon-old\data1\Powertrain_DIP-A entry.mig\PROJECT INFORMATION\Data
\\f-typhon-old\data2\powertrain_emb_ice_algorithm_OLD.mig\Data\05_DCM

所以我创建了一个带有基线的新文件来纠正这样的acl

data1\Nissan Production Engineering\TC Facility\X11M
data1\Powertrain_DIP-A entry\IQMS\Data
data1\Powertrain_DIP-A entry\PROJECT INFORMATION\Data
data2\powertrain_emb_ice_algorithm_OLD.mig\Data\05_DCM

使用 get-acl 和 set-acl 在文件上制作了一个带有循环的小脚本以更正,但问题是我需要一个文本操作来创建一个变量 $level3old 以将 .mig 的路径存储在我不使用的 level1 文件夹中现在不知道该怎么做,或者在powershell中是否可行

$Pth = "C:\temp\mig\mig_CDOT\0INCHE\Log\Robocopy\Extract\acl_user"
$filerd = "na0maa-euc01"
$filers = "f-typhon-old"
$N3 = gc $pth\N3_witheveryoneacess_base.txt

foreach ($level3 in $N3) {
    $level3old = how too replace datax\level1\level2\level3 with datax\level1.mig\level2\level3
    get-acl "\\$filers\$level3old " | set-acl "\\$filerd\$level3"
}

标签: stringpowershell

解决方案


我不完全确定您的变量始终包含什么。所以我会提供一些例子。

假设$level3包含服务器名称并且没有.mig

$level3 = '\\na0maa-euc01\data1\Nissan Production Engineering\TC Facility\X11M'
$level3old = $level3 -replace '^\\\\.*?\\(.*?\\[^\\]+)','$1.mig'

# Output
$level3old
data1\Nissan Production Engineering.mig\TC Facility\X11M

假设$level3从共享文件夹开始并且不包含.mig

$level3 = 'data1\Nissan Production Engineering\TC Facility\X11M'
$level3old = $level3 -replace '^.*?\\[^\\]+','$&.mig'

# Output
$level3old
data1\Nissan Production Engineering.mig\TC Facility\X11M

解释:

-replace使用正则表达式匹配,后跟字符串替换(带有一些匹配引用)。由于\是正则表达式特殊字符,因此必须对反斜杠进行转义以进行文字匹配。所以要匹配\,你需要\\。要匹配\\,您需要\\\\,即\每个文字一个转义\

初始^匹配字符串的开头。这是开始匹配字符串的第一个可能位置。

.*?惰性匹配任何字符。这通常会继续匹配,直到遇到另一个匹配条件。所以.*?\\将匹配任何字符,直到并包括下一个\

[^]是否定字符类。后面的任何内容^[]匹配除这些字符之外的任何内容。[^\\]匹配除\.

+匹配一个或多个先前的匹配。[^\\]+匹配除\一次或多次以外的任何内容。

在替换字符串中,$1指的是捕获组 1 中的匹配字符。在正则表达式部分,()表示捕获组。第一个打开的(开始捕获组,除非您明确命名它,否则它的名称为 1。

在替换字符串中,$&指的是每个匹配的字符。$0也可以使用,因为整个匹配默认捕获组 0。


推荐阅读