运行 来自 PowerShell 的 Plink 命令失败并显示“■e:未找到”

Running commands over Plink from PowerShell fails with "■e: not found"

感谢您的帮助。所以我的脚本有问题。我正在尝试将我的脚本从批处理转换为 PowerShell,主要是为了尝试学习它,所以我对 PowerShell 是全新的,但我知道其他语言,所以我在编程方面很不错。我的脚本创建了一个 kivaCommands.txt 文件,然后在 Plink 中使用该文件在服务器上执行。我的批处理脚本在 Plink 上运行良好,但当我转换为 PowerShell 时,-m 开关上的 Plink 行错误。我得到

sh:  ■e:  not found

无论 txt 文件中有什么命令,我都会收到此错误,即使该文件为空也是如此。如果我向 Plink 行传递一个要执行的命令,它就可以正常工作。这是我遇到问题的代码。

$hostLogin = "myServer"
$passwd = "myPassword"
$command = "H:\kivaCommands.txt"

C:
cd \
cd "Program Files (x86)\PuTTY"

./PLINK.EXE -ssh $hostLogin -P 22 -pw $passwd -m $command

cd 命令是我让它工作的唯一方法。我尝试了提供整个路径并为路径创建变量的所有其他方法,但 Plink 不会执行。

所以在进行更多故障排除后,我将范围缩小到创建的文件。如果我手动创建文件,它工作正常,但我的脚本在调用 Plink 之前创建文件。我尝试了三种不同的方法来创建文件

"exit ^| sqlplus / @kiva_extract $assessorYear" | Set-Content H:\kivaCommands.txt -Encoding Unicode

"exit ^| sqlplus / @kiva_extract $assessorYear" | Out-File H:\kivaCommands.txt -Encoding Unicode

"exit ^| sqlplus / @kiva_extract $assessorYear" > H:\kivaCommands.txt

文件创建良好且看起来正确,但 Plink 无法正确打开。

尝试像这样执行它:

& 'C:\Program Files (x86)\PuTTY\Plink.exe' -ssh $hostLogin -P 22 -pw $passwd -m $command

当一个exe路径中有空格时,你必须引用路径。但是,PowerShell 的引用路径是 just 字符串。您需要告诉 PowerShell 执行字符串命名(或 exe 指向)的命令。这就是调用运算符 & 所做的。它说 "execute the string to the right of me"。请注意,该字符串只是命令名称,不应包含命令的任何参数。

PowerShell 生成的 UTF-8 输出文件以 UTF-8 BOM mark.

开头

Unix 系统通常不期望 BOM,因此远程 shell 试图将其解释为命令,但失败了。 BOM就是错误信息中的方块字符():

sh:  ■e:  not found

我不知道如何防止 BOM 出现在输出中。

但是你可以去掉它 ex-post:

$MyPath = "H:\kivaCommands.txt"
$MyFile = Get-Content $MyPath
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)

Using PowerShell to write a file in UTF-8 without the BOM

我已经 运行 解决了 tst10 的这个问题,发现不使用编码 Unicode 而是尝试 ASCII。原因是 plink 正在寻找 windows txt 文件。

文本文件是 ASCII 格式,所以下面一行不会是:

^| sqlplus / @kiva_extract $assessorYear" | Out-File H:\kivaCommands.txt -Encoding Unicode

它将是:

^| sqlplus / @kiva_extract $assessorYear" | Out-File H:\kivaCommands.txt -Encoding ASCII