我是PowerShell的新手。我创建了一个powershell脚本,需要在参数中提供的路径中搜索字符串并替换该字符串。但实际上它正在用新字符串替换整个文件内容。
我在Windows 10操作系统中使用Powershell。 代码:
param(
[Parameter(Mandatory=$true, ParameterSetName="Path", Position=0,HelpMessage='Data folder Path')]
[string] $Path,
[Parameter(Mandatory=$true, HelpMessage='Input the string to be replaced')]
[string] $Input,
[Parameter(Mandatory=$true,HelpMessage='Input the new string that need to be replaced')]
[string] $Replace
)
$a = Test-Path $Path
IF ($a -eq $True) {Write-Host "Path Exists"} ELSE {Write-Host "Path Doesnot exits"}
$configFiles = Get-ChildItem -Path $Path -include *.pro, *.rux -recurse
$Append = join-path -path $path \*
$b = test-path $Append -include *.pro, *.rux
If($b -eq $True) {
foreach ($file in $configFiles)
{
(Get-Content $file.PSPath) |
Foreach-Object { $_ -replace [regex]::Escape($Input), $Replace } |
Set-Content $file.PSPath
}
$wshell = New-Object -ComObject Wscript.Shell
$wshell.Popup("Operation Completed",0,"Done",0x0)
}
答案 0 :(得分:1)
尽管如此,我可以在不直接复制的情况下阅读本文,但这是错误的地方:
(get-content $ file.pspath)获取文件的全部内容,而不是其名称。
你的" foreach"然后在文件中的每一行中进行正则表达式,最后" set-content"替换文件的内容,而不是其路径。
如果要更改文件名,则需要查找Rename-Item,而不是Set-Content。如果你想要一个文件$ file.Name的名称,你就不需要Get-Content,这将......获取它的内容:)
答案 1 :(得分:1)
这应该是一个有效的解决方案。
Param(
[Parameter(Mandatory,
ParameterSetName='Path',
Position=0,
HelpMessage='Data folder Path')]
[String]
$Path,
[Parameter(Mandatory,
HelpMessage='Input the string to be replaced')]
[String]
$StringToReplace,
[Parameter(Mandatory,
HelpMessage='Input the new string that need to be replaced')]
[String]
$ReplacementString
)
If (!(Test-Path $Path)) {
Write-Host 'Path does not exist'
Return
}
Get-ChildItem -Path $Path -Include *.pro,*.rux -Recurse |
? { $_.Name -like "*$StringToReplace*" } |
% { Rename-Item $_ $($ReplacementString+$_.Extension) }
(New-Object -ComObject Wscript.Shell).Popup("Operation Completed",0,"Done",0x0)