string - 在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"
}
解决方案
我不完全确定您的变量始终包含什么。所以我会提供一些例子。
假设$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。
推荐阅读
- java - 用于 Hibernate 的 SearchObject/SearchResult Wrapper API
- python - 如何在不创建多个循环的情况下从循环中的列表分别检查每个键。可能有 KeyError 等
- shopify - Shopify - 生成预购 ID 并与以后的订单 ID 连接?
- mariadb - 将 utf8mb3 更改为 mb4 mariadb
- javascript - 如何在电子中重建 epoll 包?
- flutter - 如何在 Flutter 中的 Text 小部件中打印 api SocketException 错误
- iphone - 如何从 iPhone HDRI 照片(.HEIC 格式)导出 .hdr 或 .exr 图像?
- python - 在操作变量值的情况下如何使用多重继承
- java - 从命令行运行 mvn install 时出现 Jacoco 错误
- python-3.x - 多服务器