Powershell字符串未正确串联

问题描述

所以我有

$Logfilename = "E:\Deployment Logs\20201026 - 1_ProductInfo"
Write-Host $Logfilename
E:\Deployment Logs\20201026 - 1_ProductInfo


$Newname = $Logfilename + ".log"
Write-Host $Newname
.logeployment Logs\20201026 - 1_ProductInfo


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

但是,当我尝试从变量名运行Get-Content时,出现此错误。这也很奇怪,因为错误消息显示一个字符串,但是上面的Write-Host .logeployment Logs\20201026 - 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 Logs\20201026 - 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

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

解决方法

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

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

一个简单的复制是:

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

回车符不是文件名中的有效字符,这就是为什么您还会看到该错误的原因。看起来它也已从错误消息中删除,因此它只是显示串联的两个字符串的“ expected”值:

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

这可能是因为您从其他系统剪切并粘贴了原始值,并且在不知道的情况下拾取了隐藏字符。

要解决此问题,只需删除$Logfilename = "E:\Deployment Logs\20201026 - 1_ProductInfo"行中的最后几个字符,然后手动重新输入。删除字符时,您可能会注意到,当您按下 del backspace 的其中一次时,似乎什么都不会发生-那是在删除非打印字符时

更新

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

PS E:\Deployment Plans> $Logfilename.length
44

PS E:\Deployment Plans> $Newname.length
48

PS> "E:\Deployment Logs\20201026 - 1_ProductInfo".Length
43

PS> "E:\Deployment Logs\20201026 - 1_ProductInfo.log".Length
47

这告诉我们$Logfilename的末尾可能还有一个额外的非印刷字符。

下一步:

PS> [System.Text.Encoding]::UTF8.GetBytes("E:\Deployment Logs\20201026 - 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...