Powershell字符串连接不正确



所以我有

$Logfilename = "E:Deployment Logs20201026 - 1_ProductInfo"
Write-Host $Logfilename
E:Deployment Logs20201026 - 1_ProductInfo

$Newname = $Logfilename + ".log"
Write-Host $Newname
.logeployment Logs20201026 - 1_ProductInfo

Get-Content -Path "E:Deployment Logs20201026 - 1_ProductInfo.log"
#returns file normally

但是,当我尝试从变量名运行GetContent时,会出现此错误。这也很奇怪,因为错误消息显示了一个字符串,但上面的写入主机.logeployment Logs20201026 - 1_ProductInfo显示了不同的字符串。

Get-Content -Path $Newname
Get-Content : Illegal characters in path.
At line:1 char:1
+ Get-Content -Path $Newname
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidArgument: (E:Deployment L...roductInfo.log:String) [Get-Content], ArgumentException
+ FullyQualifiedErrorId : ItemExistsArgumentError,Microsoft.PowerShell.Commands.GetContentCommand

Get-Content : Cannot find path 'E:Deployment Logs20201026 - 1_ProductInfo.log' because it does not exist.
At line:1 char:1
+ Get-Content -Path $Newname
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (E:Deployment L...roductInfo.log:String) [Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand

我完全不知道这里发生了什么。该文件肯定存在于给定的路径中。我已尝试为隐藏字符添加.replace,\r\n但没有成功。我尝试过通过Out-String编写变量内容,然后添加.log,同样的事情也发生了。对此有什么解释或解决办法吗?

在注释中的对话中,脚本文件在$Logfilename = "E:Deployment Logs20201026 - 1_ProductInfo"行的字符串末尾有一个隐藏的Carriage Return字符(尚未复制到问题中的脚本中(。

当您使用write-host输出字符串时,Carriage Return会将光标移回控制台行的开头,然后继续写入字符串的其余部分。

一个简单的repro是:

PS> "E:Deployment Logs20201026 - 1_ProductInfo$([char]0x000D).log"
.logeployment Logs20201026 - 1_ProductInfo

Carriage Return在文件名中不是有效字符,这就是为什么您也会看到错误的原因。它看起来也被从错误消息中删除了,所以它只是显示";预期的";连接的两个字符串的值:

Get-Content : Cannot find path 'E:Deployment Logs20201026 - 1_ProductInfo.log' because it does not exist.

这可能是因为你剪了&粘贴了其他系统的原始值,你在不知情的情况下发现了隐藏的字符。

要解决此问题,只需删除$Logfilename = "E:Deployment Logs20201026 - 1_ProductInfo"行中的最后几个字符,然后手动重新键入。当你删除字符时,你可能会注意到,有一次你按下del

backspace更新

如果评论被删除,我们通过以下测试解决了问题:

PS E:Deployment Plans> $Logfilename.length
44
PS E:Deployment Plans> $Newname.length
48

PS> "E:Deployment Logs20201026 - 1_ProductInfo".Length
43
PS> "E:Deployment Logs20201026 - 1_ProductInfo.log".Length
47

这告诉我们在CCD_ 8的末尾可能有一个额外的非打印字符。

下一篇:

PS> [System.Text.Encoding]::UTF8.GetBytes("E:Deployment Logs20201026 - 1_ProductInfo.log".)
.
.
73
110
102
111

但是

PS> [System.Text.Encoding]::UTF8.GetBytes($Logfilename)
.
.
73
110
102
111
13

因此,额外的字符是UTF字符13(十进制(,即U+000D,即回车-请参阅http://www.fileformat.info/info/unicode/char/000d/index.htm

相关内容

  • 没有找到相关文章

最新更新