使用PuTTY Plink执行.ps1文件时出现意外的char

时间:2018-09-17 12:51:24

标签: windows powershell ssh putty plink

我正在使用Putty的Plink工具远程执行一些脚本来从服务器获取信息。当我使用.ps1文件时,麻烦就来了,因为一个'?'出现在开头,使第一行不正确,但是.bat文件可以按需工作。

例如,我要打印文件的内容:

GetDate.bat:

type C:/Data/DateOfCompilation.txt

然后:

PS C:/Users/MyUser> plink -ssh <User>@<IP> -i C:\Key.ppk -m C:\Scripts\GetDate.bat
10/09/2018 14:32:02,72

一切都很好

GetDate.ps1:

Get-Content -Path C:/Data/DateOfCompilation.txt

执行:

PS C:/Users/MyUser> plink -ssh <User>@<IP> -i C:\Key.ppk -m C:\Scripts\GetDate.ps1

?Get-Content : The term '?Get-Content' is not recognized as the name of a
cmdlet, function, script file, or operable program. Check the spelling of 
the name, or if a path was included, verify that the path is correct and try 
again. At line:1 char:1 

+ ?Get-Content -Path C:/Data/DateOfCompilation.txt
+ ~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (?Get-Content:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

此外,如果我添加更多代码,其他行也可以正常工作,它只是第一个失败,并在开头添加了'?'

(但是,在本地运行脚本可以正常工作)

我还对其他ps1脚本进行了扩展,因此最好不要使用bat文件。

我已经看过文档,其他论坛以及此处,但是找不到任何东西。也许我对ps1文件一无所知。

1 个答案:

答案 0 :(得分:0)

检查GetDate.ps1开头是否有UTF-8 BOM-如果有,请将其删除。


尽管造成问题的根本原因可能是您对Plink的-m开关的误解。它使Plink读取文件并将其内容(和仅内容)发送到服务器。服务器从不学习文件扩展名是什么。因此,使用.ps vs .bat毫无意义。不管扩展名是什么,该文件都将由Windows SSH服务器的默认外壳程序解释。什么是PowerShell(根据错误消息)。

因此,即使您的.bat文件中的type命令也是由PowerShell执行的,而不是cmd.exe。在PowerShell中,typeGet-Content的别名。

.bat文件起作用的原因很可能是它没有BOM,而.ps1有BOM。如果使用PowerShell执行.ps1,它将正确处理BOM。但是您没有在PowerShell中执行.ps1,而是在执行其内容,因此BOM可能会导致问题。

两者之间的区别基本上是:

powershell.exe -File GetDate.ps1

powershell.exe < GetDate.ps1

两者基本相同,但是后者无法使用BOM,而第一个可以正确处理。