循环将 c:\, d:\ ... z:\ 替换为 \\servername\c$\
Loop to replace c:\, d:\ ... z:\ with \\servername\c$\
实际上,我正在尝试构建一些代码来识别企业中每台服务器中共享文件夹的权限。
目前,我已经列出了每台服务器并将其导出到一个 .txt 文件中,在此 .txt 上循环以将所有共享文件夹导出到另一个 .txt 文件中。
一切正常,但路径如下:c:\...\...\folder$
。
为了能够使用它,我需要做一个循环来替换 c:\
d:\
等 \servername\c$\
.
我试过使用 [system.io.file]::ReadAllText
和 WriteAllText
,它对一个字母工作正常,但没有找到对其进行循环的方法。
我试过了
get-content ... -replace "c:\","\$ServerName\c$\" ` -replace "d:\" ...
但收到有关正则表达式无效的错误,因此尝试使用 [regex]::Escape
但也没有按预期工作...
Powershell
$contenu = [System.IO.File]::ReadAllText("$path$SharedFolders.txt").Replace("C:\","\$SharedFolders\c$\")
[System.IO.File]::WriteAllText("$path$SharedFolders.txt", $contenu)
Powershell
(Get-Content "$path$SharedFolders.txt") | foreach {
$_ -replace "C:\","\$SharedFolders\C$\" `
-replace "D:\","\$SharedFolders\D$\" `
[...] | Set-Content "$path$sharedfolders.txt"}
我想要这样的东西:
Powershell
('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\`$\"
我电脑上的示例输出
$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\`$\" |
Set-Content $File
谢谢你的帮助,我只是设法让它像这样工作:
$lecteur=[int][char]'A'
1..26 | % {
$LR=[char]$lecteur
$contenu =[System.IO.File]::ReadAllText("$path$SharedFolders.txt").Replace("${LR}:\","\$SharedFolders$LR$\")
[System.IO.File]::WriteAllText("$path$SharedFolders.txt", $contenu)
$lecteur++
}
希望对某些人有所帮助 ;)
实际上,我正在尝试构建一些代码来识别企业中每台服务器中共享文件夹的权限。
目前,我已经列出了每台服务器并将其导出到一个 .txt 文件中,在此 .txt 上循环以将所有共享文件夹导出到另一个 .txt 文件中。
一切正常,但路径如下:c:\...\...\folder$
。
为了能够使用它,我需要做一个循环来替换 c:\
d:\
等 \servername\c$\
.
我试过使用 [system.io.file]::ReadAllText
和 WriteAllText
,它对一个字母工作正常,但没有找到对其进行循环的方法。
我试过了
get-content ... -replace "c:\","\$ServerName\c$\" ` -replace "d:\" ...
但收到有关正则表达式无效的错误,因此尝试使用 [regex]::Escape
但也没有按预期工作...
Powershell
$contenu = [System.IO.File]::ReadAllText("$path$SharedFolders.txt").Replace("C:\","\$SharedFolders\c$\")
[System.IO.File]::WriteAllText("$path$SharedFolders.txt", $contenu)
Powershell
(Get-Content "$path$SharedFolders.txt") | foreach {
$_ -replace "C:\","\$SharedFolders\C$\" `
-replace "D:\","\$SharedFolders\D$\" `
[...] | Set-Content "$path$sharedfolders.txt"}
我想要这样的东西:
Powershell
('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\`$\"
我电脑上的示例输出
$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\`$\" |
Set-Content $File
谢谢你的帮助,我只是设法让它像这样工作:
$lecteur=[int][char]'A'
1..26 | % {
$LR=[char]$lecteur
$contenu =[System.IO.File]::ReadAllText("$path$SharedFolders.txt").Replace("${LR}:\","\$SharedFolders$LR$\")
[System.IO.File]::WriteAllText("$path$SharedFolders.txt", $contenu)
$lecteur++
}
希望对某些人有所帮助 ;)