从PowerShell通过Plink运行命令失败,并显示“■e:not found”

时间:2015-07-08 20:23:56

标签: powershell batch-file plink

感谢您的帮助。所以我的脚本有问题。我正在尝试将我的脚本从批处理转换为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无法正确打开。

3 个答案:

答案 0 :(得分:1)

PowerShell生成的UTF-8输出文件以UTF-8 BOM mark开头。

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

sh:  ■e:  not found

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

但你可以事后剥掉它:

$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

答案 1 :(得分:0)

尝试执行此操作:

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

当exe路径中包含空格时,您必须引用路径。但是PowerShell的引用路径是just一个字符串。您需要告诉PowerShell执行字符串命名(或exe指向)的命令。这就是调用操作符&的作用。它说“执行我右边的字符串”。请注意,该字符串只是命令名称,不应包含该命令的任何参数。

答案 2 :(得分:0)

我使用 tst10 遇到了这个问题,发现不使用编码 Unicode 而是尝试 ASCII 。原因是plink正在寻找一个Windows txt文件。

文本文件采用 ASCII 格式,因此以下行不会是:

class Quadratic:
    def __init__(self, a, b, c):
        self.a, self.b, self.c = a, b, c
        self.d = float(self.b ** 2 - 4*self.a*self.c)
        self.x1 = ((-b)-cmath.sqrt(self.d))/(2*a)
        self.x2 = ((-b)+cmath.sqrt(self.d))/(2*a)

    @property
    def solution(self):
        return [x.real if x.imag == 0.0 else x for x in [self.x1, self.x2]]

    def __str__(self):
        return "X1 = {}, X2 = {}".format(*self.solution)


myList = [[1, 2, 1], [9, 12, 4], [1, -7, 0], [1, 2, -3]]
for _ in myList:
    print Quadratic(*_)

它将是:

function createList(depth, elements, iterator, parentElement) {
      var newDepth = 0;
      for(var i=iterator; i<elements.length; i++) {
        var match = elements[i].text.match(/^\s*(\/+)/);
        if(match == null) {
            newDepth = 0;
        } else {
            newDepth = match[0].length;
        }
        if (depth == newDepth-1) {
          var nestedList = document.createElement('ul');
          parentElement.lastChild.appendChild(nestedList);
          createList(newDepth, elements, i, nestedList);
        } else if (depth == newDepth) {
          var nextElement = document.createElement('li');
          var span = document.createElement('span');
          span.innerHTML = elements[i].text;
          nextElement.appendChild(span);
          parentElement.appendChild(nextElement);
        }
      }
    }

var value = ['Home', '* This is active', '/This is dropdown', '// shhh...', '/ we ♥ you', '//Last one', 'Last one', 'Last one']
        .map(function(pLine) {
          return {
            'text': pLine,
            'page_id': null
          };
        });

var listElement = document.createElement('ul');

createList(0, value, 0, listElement);

document.body.appendChild(listElement);