我正在使用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文件一无所知。
答案 0 :(得分:0)
检查GetDate.ps1
开头是否有UTF-8 BOM-如果有,请将其删除。
尽管造成问题的根本原因可能是您对Plink的-m
开关的误解。它使Plink读取文件并将其内容(和仅内容)发送到服务器。服务器从不学习文件扩展名是什么。因此,使用.ps vs .bat毫无意义。不管扩展名是什么,该文件都将由Windows SSH服务器的默认外壳程序解释。什么是PowerShell(根据错误消息)。
因此,即使您的.bat文件中的type
命令也是由PowerShell执行的,而不是cmd.exe
。在PowerShell中,type
是Get-Content
的别名。
.bat文件起作用的原因很可能是它没有BOM,而.ps1有BOM。如果使用PowerShell执行.ps1,它将正确处理BOM。但是您没有在PowerShell中执行.ps1,而是在执行其内容,因此BOM可能会导致问题。
两者之间的区别基本上是:
powershell.exe -File GetDate.ps1
和
powershell.exe < GetDate.ps1
两者基本相同,但是后者无法使用BOM,而第一个可以正确处理。