Board logo

标题: [问题求助] POWERSHELL 处理特殊文件名问题 [打印本页]

作者: terse    时间: 2013-11-6 23:06     标题: POWERSHELL 处理特殊文件名问题

本帖最后由 terse 于 2013-11-6 23:10 编辑

http://bbs.bathome.net/viewthrea ... mp;extra=#pid139948
此贴楼主 提到文件名含 中括号 会有问题
不知怎么处理 转来此版
POWERSHELL 如遇特殊文件名 是怎样处理呢 还有其他什么字符也存在这样问题吗?
附上代码  如代码有问题 望指正
  1. $n = 2.89
  2. $Ph = "c:\test"
  3. $Ext = "txt"
  4. function Get-Encoding ($ph)
  5. {
  6. $ByteStr = Get-Content $Ph -Encoding Byte -TotalCount 3
  7. $BOM = "{0:X}{1:X}{2:X}" -f $ByteStr
  8. if ($BOM -eq "EFBBBF") { "UTF8" }
  9. Else {
  10.        $BOM = "{0:X}{1:X}" -f $ByteStr
  11.        if ($BOM -eq "FFFE") { "Unicode" }
  12.            Elseif ($BOM -eq "FEFF") {"BigEndianUnicode"}
  13.            Else {"Ascii"}
  14.        }
  15. }
  16. get-childitem "$Ph\*" -include *.$Ext | ?{
  17. $Encoding = Get-Encoding($_)
  18. (Get-Content $_ | % {
  19.     if ($_ -cmatch '(.+\\pos\()(\d+),(\d+)(.*)') {
  20.        "$($matches[1])$([int]($n * $matches[2])),$([int]($n * $matches[3]))$($matches[4])"
  21.     } else {"$_"}
  22. }) | Set-Content  -Encoding $Encoding $_
  23. }
复制代码

作者: nwm310    时间: 2013-11-8 08:12

Get-Content -LiteralPath
作者: PowerShell    时间: 2013-11-8 09:37

楼上正解,就用  -LiteralPath
对于 所有带路径的,不管是相对还是绝对,  所有遇到中括号[] 的路径,都要告诉powershell无需转义,
这个参数没学到这个程度的人不知何意.

这个参数99%该用到的地方,powershell都给相关命令加上了这个参数,但是还有些没带,或许因为powershell还不完善,或许因为开发团队觉得没必要.
作者: Batcher    时间: 2013-11-8 10:11

-LiteralPath 和 findstr命令的 /l 选项是一个意思,这个参数入门者都应该懂。
作者: PowerShell    时间: 2013-11-8 17:00

那么说,我想知道,都哪些命令带有这个参数呢?
或者说
哪些 命令、操作可以,它后面跟者的参数,是更绝对的文件名,而无需转换,转义呢?
  1. GET-COMMAND * -ParameterName LiteralPath
复制代码
即可.
------------------------返回结果如下----------------------------
Function        Get-FileHash                                       Microsoft.PowerShell.Utility
Cmdlet          Add-Content                                        Microsoft.PowerShell.Management
Cmdlet          Add-Type                                           Microsoft.PowerShell.Utility
Cmdlet          Clear-Content                                      Microsoft.PowerShell.Management
Cmdlet          Clear-Item                                         Microsoft.PowerShell.Management
Cmdlet          Clear-ItemProperty                                 Microsoft.PowerShell.Management
Cmdlet          Convert-Path                                       Microsoft.PowerShell.Management
Cmdlet          Copy-Item                                          Microsoft.PowerShell.Management
Cmdlet          Copy-ItemProperty                                  Microsoft.PowerShell.Management
Cmdlet          Export-Alias                                       Microsoft.PowerShell.Utility
Cmdlet          Export-Clixml                                      Microsoft.PowerShell.Utility
Cmdlet          Export-Csv                                         Microsoft.PowerShell.Utility
Cmdlet          Export-FormatData                                  Microsoft.PowerShell.Utility
Cmdlet          Get-ChildItem                                      Microsoft.PowerShell.Management
Cmdlet          Get-Content                                        Microsoft.PowerShell.Management
Cmdlet          Get-Item                                           Microsoft.PowerShell.Management
Cmdlet          Get-ItemProperty                                   Microsoft.PowerShell.Management
Cmdlet          Import-Alias                                       Microsoft.PowerShell.Utility
Cmdlet          Import-Clixml                                      Microsoft.PowerShell.Utility
Cmdlet          Import-Csv                                         Microsoft.PowerShell.Utility
Cmdlet          Invoke-Item                                        Microsoft.PowerShell.Management
Cmdlet          Move-Item                                          Microsoft.PowerShell.Management
Cmdlet          Move-ItemProperty                                  Microsoft.PowerShell.Management
Cmdlet          New-ItemProperty                                   Microsoft.PowerShell.Management
Cmdlet          Out-File                                           Microsoft.PowerShell.Utility
Cmdlet          Push-Location                                      Microsoft.PowerShell.Management
Cmdlet          Remove-Item                                        Microsoft.PowerShell.Management
Cmdlet          Remove-ItemProperty                                Microsoft.PowerShell.Management
Cmdlet          Rename-Item                                        Microsoft.PowerShell.Management
Cmdlet          Rename-ItemProperty                                Microsoft.PowerShell.Management
Cmdlet          Resolve-Path                                       Microsoft.PowerShell.Management
Cmdlet          Save-Help                                          Microsoft.PowerShell.Core
Cmdlet          Select-String                                      Microsoft.PowerShell.Utility
Cmdlet          Select-Xml                                         Microsoft.PowerShell.Utility
Cmdlet          Set-Content                                        Microsoft.PowerShell.Management
Cmdlet          Set-Item                                           Microsoft.PowerShell.Management
Cmdlet          Set-ItemProperty                                   Microsoft.PowerShell.Management
Cmdlet          Set-Location                                       Microsoft.PowerShell.Management
Cmdlet          Split-Path                                         Microsoft.PowerShell.Management
Cmdlet          Start-Job                                          Microsoft.PowerShell.Core
Cmdlet          Tee-Object                                         Microsoft.PowerShell.Utility
Cmdlet          Test-Path                                          Microsoft.PowerShell.Management
Cmdlet          Unblock-File                                       Microsoft.PowerShell.Utility
Cmdlet          Update-Help                                        Microsoft.PowerShell.Core



命令数量=多,powershell才敢说强大.
作者: terse    时间: 2013-11-8 21:01

先谢谢 各位的热心解答
查到  -LiteralPath <string[]>
    指定项的路径。与 Path 不同,LiteralPath 的值严格按照所键入的形式使用。不会将任何字符解释为通配符。如果路径包括
    转义符,请将其括在单引号中。单引号会告知 Windows PowerShell 不要将所有字符都解释为转义序列。
现在那个贴里又出现新情况 就是  match 只能匹配一项 不能处理一行出现多个匹配的 用 replace 又不知怎样运算 本人才疏学浅   版主能否送佛送到西天
作者: terse    时间: 2013-11-9 02:28

本帖最后由 terse 于 2013-11-10 15:26 编辑

这样处理了 帮看下行不
重新编辑一下规则
  1. $n = 1.5
  2. $m = 2.5
  3. $Ph = "c:\te st"
  4. $Ext = "txt"
  5. $Reg = '(?i)(\\pos\()(\d+),(\d+)'
  6. function GetEncoding ($ph)
  7. {
  8.    $ByteStr = Get-Content -LiteralPath $Ph -Encoding Byte -TotalCount 3
  9.    $BOM = "{0:X}{1:X}{2:X}" -f $ByteStr
  10.    if ($BOM -eq "EFBBBF")
  11.    {
  12.       "UTF8"
  13.    }
  14.    Else
  15.    {
  16.       $BOM = "{0:X}{1:X}" -f $ByteStr
  17.       if ($BOM -eq "FFFE")
  18.       {
  19.        "Unicode"
  20.       }
  21.       Elseif ($BOM -eq "FEFF")
  22.       {
  23.          "BigEndianUnicode"
  24.       }
  25.       Else {"Ascii"}
  26.    }
  27. }
  28. function GetReplace($a)
  29. {
  30.   $a -match $Reg |out-null
  31.   "$($matches[1])$([int]($n * [int] $matches[2])),$([int]($m * [int] $matches[3]))"
  32. }
  33. foreach ($File in Get-Childitem "$Ph\*" -include *.$Ext)
  34. {
  35.      $Encoding = GetEncoding($File)
  36.      (Get-Content -LiteralPath $File| % {
  37.           [RegEx]::Replace($_,$Reg,{param($a)GetReplace($a)})
  38.      })| Set-Content -Encoding $Encoding -LiteralPath $File
  39. }
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2