powershell - 循环将 c:\, d:\ ... z:\ 替换为 \\servername\c$\
问题描述
我实际上正在尝试构建一些代码来识别我企业中每台服务器中共享文件夹的权限。
现在,我已经列出了每台服务器并将其导出到一个 .txt 文件中,在这个 .txt 上执行循环以将所有共享文件夹导出到另一个 .txt 文件中。
所有这一切都很好,但路径就像 : c:\...\...\folder$
。为了能够使用它,我需要做一个循环来替换c:\
d:\
等\\servername\c$\
。
我试过使用[system.io.file]::ReadAllText
and WriteAllText
,它对一个字母工作正常,但没有找到一种方法来循环它。
我试过了
get-content ... -replace "c:\","\\$ServerName\c$\" ` -replace "d:\" ...
但得到一个关于正则表达式无效的错误,所以尝试[regex]::Escape
但没有按预期工作......
电源外壳
$contenu = [System.IO.File]::ReadAllText("$path\$SharedFolders.txt").Replace("C:\","\\$SharedFolders\c$\")
[System.IO.File]::WriteAllText("$path\$SharedFolders.txt", $contenu)
电源外壳
(Get-Content "$path\$SharedFolders.txt") | foreach {
$_ -replace "C:\","\\$SharedFolders\C$\" `
-replace "D:\","\\$SharedFolders\D$\" `
[...] | Set-Content "$path\$sharedfolders.txt"}
我想要这样的东西:
电源外壳
('a'..'z').ForEach({ (Get-Content "$path\$SharedFolders.txt" -Raw).replace("$_`:\","\\$SharedFolders\$_$") })
但我在 Powershell 中太新手了,无法使其正常工作
解决方案
- 您需要 PSv6 才能使用
'a'..'z'
- 该
-replace
运算符基于 RegEx,您需要使用模式中的另一个反斜杠来转义文字反斜杠。 - 按照@Lee_Dailey的提示构建具有有效驱动器号的正则表达式
$OFS = '|'
$RE = ('('+(Get-Psdrive -PSProvider filesystem).where({$_.Displayroot -notmatch '^\\'}).name)+'):\\'
$OFS = $Null
"`$RE = '{0}'" -f $RE
'Loop to replace c:\, d:\ … z:\ with \\servername\c$\' -replace $RE,"\\servername\`${1}$\"
我的电脑上的示例输出
$RE = '(A|C|D):\\'
Loop to replace \\servername\c$\, \\servername\d$\ … z:\ with \\servername\c$\
使用 -raw 参数读取文件不需要循环,但会立即进行所有更改。
$OFS = '|'
$RE = ('('+(Get-Psdrive -PSProvider filesystem).where({$_.Displayroot -notmatch '^\\'}).name)+'):\\'
$OFS = $Null
$File = "$path\$SharedFolders.txt"
(Get-Content $File -raw) -replace $RE,"\\servername\`${1}$\" |
Set-Content $File
推荐阅读
- javascript - 在highcharts中将背景框添加到y轴
- r - 使用公式表示的 R 中配对 t 检验函数的数据组织
- android - android中onItemSelected微调器的问题
- javascript - Discord bot:努力统计表情符号对投票的反应
- html - 将 HTML 导出为带有日文字符的 PDF
- java - Openssl(shell脚本)等价于java解密代码
- reactjs - 如何将资源放在其他组件中?
- c# - 如何创建 mvc 项目模板并在 VSIX 项目中使用它。项目中不存在目标“TemplateProjectOutputGroup”
- windows - 有没有办法在 Windows 热点上实现强制门户?
- selenium-webdriver - 如何获取放心的jsonPath().getMap方法返回的map值