2016-09-22 166 views
0

我试图替换包含在我从数据库查询的文件名中包含的\。我的脚本通过包含项目代码的CSV进行循环。对于每个项目代码,查询数据库并检索项目名称。循环并替换文件名中的反斜杠(字符串)

但是,项目名称包含我试图替换的\

$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) 
+0

你会得到什么错误? –

+0

请不要修复您的问题中的代码。它可以使答案失效,并使人们难以解决您的原始问题。 – Matt

回答

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

默认情况下,Replace()方法不正规的字符串替换,所以上面只会替换用下划线双反斜杠。此外,它不就地更换,所以你需要修改字符串分配回变量:

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

-like操作者通配符匹配,所以你不能逃脱在表达式中的反斜杠要么,否则你甚至不会去更换操作:

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

Hi Ansgar,谢谢你的回复。我刚刚尝试过,但仍然无效。 – user3565164

+0

@ user3565164查看更新后的答案。 –

+0

嗨Ansgar,刚刚尝试过你的答案,仍然没有发生抱歉!基本上projectName会包含像'project \ subproject'这样想改成'project_subproject' – user3565164