循环并replace文件名中的反斜杠(string)

我试图replace我从数据库中查询的文件名中包含的\ 。 我的脚本通过一个包含项目代码的CSV循环。 对于每个项目代码,查询数据库并检索项目名称。

但是,项目名称包含\正在尝试replace。

 $startRow = 2 $col = 3 $excel = New-Object -COM Excel.Application $wb = $excel.Workbooks.Open("\myprojectfolder\projectcodes.csv") $excel.Visible = $false for ($i = 1; $i -le $wb.Sheets.Count; $i++){ $sh = $wb.Sheets.Item($i) $endRow = $sh.UsedRange.Rows.Count $rangeAddress = $sh.Cells.Item($startRow,$col).Address() + ":" + $sh.Cells.Item($endRow,$col).Address() $sh.Range($rangeAddress).Value2 | foreach { #GET PROJECT NAME TO APPEND TO FOLDER NAME $projectCode = $_ $Server= "MYSERVER" $Database = "MYDATABASE" $SQLQuery = $("SELECT [description] FROM [dbo].[projects] WHERE [project] = '$projectCode'") $Connection = New-Object System.Data.SQLClient.SQLConnection $Connection.ConnectionString = "server='$Server';database='$Database';trusted_connection=true;" $Connection.Open() $Command = New-Object System.Data.SQLClient.SQLCommand $Command.Connection = $Connection $Command.CommandText = $SQLQuery $Reader = $Command.ExecuteReader() while ($Reader.Read()) { $projectName = $Reader.GetValue($1) #CHECK AND REPLACE '\' CHARACTER IN PROJECTNAME if ($projectName -like '*\\*') { Write-Debug "PROJECT NAME CONTAINS \" $projectName.Replace('\\', '_') } $folderPath = "\\myfolder\" $pathTogether = $folderPath + $projectCode + "_" + $projectName + "\" New-Item -Path $pathTogether -Type Directory -force #CHECK IF FILE EXISTS IN APPROPRIATE DIRECTORY $testFile = $pathTogether + $projectCode + "_" + $projectName + ".xlsm" $fileExist = Test-Path $testFile if ($fileExist -eq $false) { $templateFile = $folderPath + "my_template\my_template.xlsm" Copy-Item $templateFile $pathTogether $newPath = $pathTogether + "\my_template.xlsm" $saveFile = $projectCode + "_" + $projectName + ".xlsm" $renameToOLD = $projectCode + "_" + $projectName + "_RENAMED" + ".xlsm" #RENAME PROJECT FILE TO HAVE OLD IN FILENAME Rename-Item $newPath $saveFile $projectxlFile = New-Object -COM Excel.Application $projectxlFile.workbooks.open($pathTogether + "\" + $saveFile) $queryWS = $projectxlFile.worksheets.Item("Query") $queryWS.Cells.Item(8,2) = $projectCode $projectxlFile.DisplayAlerts = $False $projectxlFile.Visible = $False $savePath = $pathTogether + $saveFile #Add-Type -AssemblyName Microsoft.Office.Interop.Excel #$xlFixedFormat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlOpenXMLWorkbookMacroEnabled $projectxlFile.ActiveWorkbook.Save() $projectxlFile.Workbooks.Close() $projectxlFile.Quit() $ProcID = Get-Process | Where-Object {$_.MainWindowHandle -eq $projectxlFile.HWND} | Select -ExpandProperty ID Get-Process -Id $ProcID | Stop-Process -Force ##[System.Runtime.Interopservices.Marshal]::ReleaseComObject($projectxlFile) } } $Connection.Close() } } $excel.Workbooks.Close() $excel.Quit() $ProcID2 = Get-Process | Where-Object {$_.MainWindowHandle -eq $excel.HWND} | Select -ExpandProperty ID Get-Process -Id $ProcID2 | Stop-Process -Force ###[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) 

 $projectName.Replace('\\', '_') 

在默认情况下, Replace()方法执行常规stringreplace,所以上面只会用下划线replace双反斜杠。 而且,它不会原地replace,因此您需要将修改后的string分配回variables:

 $projectName = $projectName.Replace('\', '_') 

-like操作符会执行通配符匹配,所以您不能在该expression式中转义反斜杠,否则您甚至不会进行replace操作:

 if ($projectName -like '*\*') { Write-Debug 'PROJECT NAME CONTAINS \' $projectName = $projectName.Replace('\', '_') }