【问题标题】:Powershell Able to transfer file when run manually, cannot transfer when set as schedulerPowershell 手动运行时可以传输文件,设置为调度程序时无法传输
【发布时间】:2019-12-03 19:07:35
【问题描述】:

如果手动执行,可以将文件传输到 MFT 服务器。 如果设置为作业调度程序,则无法将文件传输到 MFT 服务器。我的脚本有什么问题还是我需要添加额外的凭据?试图找到文件传输的日志,没有运气。我找不到任何日志。

####Load WinSCP .NET assembly
Add-Type -Path "D:\Users\WinSCPnet.dll" -verbose

$session = New-Object WinSCP.Session
$session.SessionLogPath = "D:\Users\SessionLog_$todayLogFile.log"
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.Protocol = [WinSCP.Protocol]::Sftp
$sessionOptions.HostName = "[linux IP address]"
$sessionOptions.UserName = "[user name share between linux]"
$sessionOptions.PortNumber = "[port number of linux]"
$sessionOptions.Password = ""
$sessionOptions.SshPrivateKeyPath = "D:\Users\Private.ppk"
$sessionOptions.SshHostKeyFingerprint = "ssh-rsa 2048 ......="
$sessionOptions.GiveUpSecurityAndAccepptAnySshHostKey = "true"

try 
{
    # Open the WinSCP.Session object using the WinSCP.SessionOptions object.
    #$session.SessionLogPath = "D:\Users\WinSCPtxt.log"
    $session.Open($sessionOptions)

    # Open WinSCP.TransferOptions
    $transferOptions = New-Object WinSCP.TransferOptions
    $transferOptions.FilePermissions = $Null # This is default
    $transferOptions.PreserveTimestamp = $False
    $transferFile = Get-ChildItem "D:\Users\*.zip" | Where-Object {($_.LastWriteTime -ge (Get-Date).AddDays(-1))}
    $destinationMFT = "/Outbox/"   

    # Upload
    $session.PutFiles( $transferFile, $destinationMFT , $False, $transferOptions).Check()

} 

#catch { Set-Content -Path 'D:\Users\result.log' $_.Exception.Message }

finally
{
    # Disconnect, clean up
    $session.Dispose()
}

软件:

  1. Powershell v2.0
  2. .Net 4.0
  3. 独立 WinSCP(无安装权限)
  4. 窗口服务器 2008
  5. WinSCP 5.13.9。如果无法加载 WinSCP.dll Loading WinSCP in PowerShell - Could not load file or assembly - This assembly is built by a runtime newer than the currently loaded runtime
  6. 每天使用任务计划程序运行

【问题讨论】:

  • 试过了。似乎没有捕获任何日志>
  • 对不起。错字在这里。在实际脚本中是正确的。
  • @MartinPrikryl 我已经标记了文件夹。所以,我目前对该文件夹具有完全访问权限。现在,我摸不着头脑,为什么手动执行能够传输文件,但是当设置任务调度程序时无法传输文件。我读了你的另一篇文章,你怀疑“D:\Users*.zip”必须放“\\computername\Users*.zip”,我试过了,但似乎也不起作用。
  • @MartinPrikryl 手动执行将创建文件。但日志文件中没有写入日志。
  • 如果 WinSCP 在创建日志文件时遇到问题,$session.Open 会抛出异常并且不会进行上传。我无法想象你能得到你所描述的行为(不是日志,但上传成功)。

标签: linux powershell job-scheduling winscp window-server


【解决方案1】:

调用作业调度程序的参数可能不正确并始终显示命中 (0x1)

  1. 启动程序 > %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe

  2. 参数 > -NoProfile -NoLogo -NonInteractive -ExecutionPolicy 绕过 -File "\path\to\file.ps1"

参考这里:PowerShell script won't execute as a Windows scheduled task

【讨论】:

  • 不要使用GiveUpSecurityAndAcceptAnySshHostKey,除非你不关心安全性。更不用说它是GiveUpSecurityAndAcce**p**tAnySshHostKey 而不是GiveUpSecurityAndAcce**pp**tAnySshHostKey - 所以你答案中的代码永远无法工作。 + "如果您的 MFT 服务器不接受任何 ssh 主机密钥" 完全没有意义。服务器不接受任何主机密钥。接受服务器主机密钥的是客户端。如果您使用正确的语法,WinSCP 当然可以接受任何主机密钥。
  • 好的,所以你已经删除了GiveUpSecurityAndAcceptAnySshHostKey -- 但现在我看不到你的回答实际上是如何回答你的问题的。
  • @MartinPrikryl 我没有太多改变我的脚本。我只是将参数更改为调用调度程序。 -NoProfile -NoLogo -NonInteractive -ExecutionPolicy 绕过 -File "\path\to\file.ps1"
  • 那么你能在你的回答中解释你到底做了什么改变以及为什么它有帮助吗?
  • 原来是-ExecutionPolicy Bypass?所以你的脚本根本没有运行?与“转移”无关?
猜你喜欢
  • 2018-11-05
  • 2020-02-15
  • 2023-04-07
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
相关资源
最近更新 更多