标题: [问题求助] POWERSHELL 处理特殊文件名问题 [打印本页]
作者: terse 时间: 2013-11-6 23:06 标题: POWERSHELL 处理特殊文件名问题
本帖最后由 terse 于 2013-11-6 23:10 编辑
http://bbs.bathome.net/viewthrea ... mp;extra=#pid139948
此贴楼主 提到文件名含 中括号 会有问题
不知怎么处理 转来此版
POWERSHELL 如遇特殊文件名 是怎样处理呢 还有其他什么字符也存在这样问题吗?
附上代码 如代码有问题 望指正- $n = 2.89
- $Ph = "c:\test"
- $Ext = "txt"
- function Get-Encoding ($ph)
- {
- $ByteStr = Get-Content $Ph -Encoding Byte -TotalCount 3
- $BOM = "{0:X}{1:X}{2:X}" -f $ByteStr
- if ($BOM -eq "EFBBBF") { "UTF8" }
- Else {
- $BOM = "{0:X}{1:X}" -f $ByteStr
- if ($BOM -eq "FFFE") { "Unicode" }
- Elseif ($BOM -eq "FEFF") {"BigEndianUnicode"}
- Else {"Ascii"}
- }
- }
- get-childitem "$Ph\*" -include *.$Ext | ?{
- $Encoding = Get-Encoding($_)
- (Get-Content $_ | % {
- if ($_ -cmatch '(.+\\pos\()(\d+),(\d+)(.*)') {
- "$($matches[1])$([int]($n * $matches[2])),$([int]($n * $matches[3]))$($matches[4])"
- } else {"$_"}
- }) | Set-Content -Encoding $Encoding $_
- }
复制代码
作者: 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
那么说,我想知道,都哪些命令带有这个参数呢?
或者说
哪些 命令、操作可以,它后面跟者的参数,是更绝对的文件名,而无需转换,转义呢?- 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 编辑
这样处理了 帮看下行不
重新编辑一下规则- $n = 1.5
- $m = 2.5
- $Ph = "c:\te st"
- $Ext = "txt"
- $Reg = '(?i)(\\pos\()(\d+),(\d+)'
- function GetEncoding ($ph)
- {
- $ByteStr = Get-Content -LiteralPath $Ph -Encoding Byte -TotalCount 3
- $BOM = "{0:X}{1:X}{2:X}" -f $ByteStr
- if ($BOM -eq "EFBBBF")
- {
- "UTF8"
- }
- Else
- {
- $BOM = "{0:X}{1:X}" -f $ByteStr
- if ($BOM -eq "FFFE")
- {
- "Unicode"
- }
- Elseif ($BOM -eq "FEFF")
- {
- "BigEndianUnicode"
- }
- Else {"Ascii"}
- }
- }
-
- function GetReplace($a)
- {
- $a -match $Reg |out-null
- "$($matches[1])$([int]($n * [int] $matches[2])),$([int]($m * [int] $matches[3]))"
- }
-
- foreach ($File in Get-Childitem "$Ph\*" -include *.$Ext)
- {
- $Encoding = GetEncoding($File)
- (Get-Content -LiteralPath $File| % {
- [RegEx]::Replace($_,$Reg,{param($a)GetReplace($a)})
- })| Set-Content -Encoding $Encoding -LiteralPath $File
- }
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |