以下脚本中的“CD”命令在本地机器上执行,而不是在远程机器上执行。哪里出了问题?
Add-PSSnapin Windows.ServerBackup -ErrorAction SilentlyContinue
set-item wsman:\localhost\Client\TrustedHosts -value 81.xxx.xx.xx
$WBResult = $WBSummary.LastBackupResultHR
$WBErrorMsg = $WBJob.ErrorDescription + "`n" + $WBSummary.DetailedMessage
$User = "administrator"
$File = "C:\Users\jsapsford\Desktop\Password.txt"
$cred = New-Object -TypeName System.Management.Automation.PSCredential `
-ArgumentList $User, (Get-Content $File | ConvertTo-SecureString)
If ($WBResult -eq 0) { $WBResult = "Successful"}
Else {$WBResult = "Failed"}
if ($WBResult -eq "Succesful") {$text = 'document.write("Succesful");'}
Else {$text = 'document.write("Failed");'}
$serverconnection = New-PSSession -ComputerName 81.xxx.xx.xx -Credential $cred
Enter-PSSession -Session $serverconnection
cd C:\website\
$text | Out-File 'company.txt'
基本上,我想做的是使用远程 powershell 连接到服务器,然后 cd 到 C:\website 并创建一个名为 company.txt 的文件,但实际发生的情况是它在本地机器而不是远程机器上执行脚本cd C:\website
。$text | Out-File 'company.txt'
有人知道为什么吗?
答案1
Enter-PSSession
通常用于交互式命令行。对于脚本化远程调用,有两种主要的PowerShell
远程处理模式Invoke-Command
。
Invoke-Command -ComputerName ... -ScriptBlock { ... }
适合一次性调用。请注意-computername
。使用此参数模式需要付出每次调用时建立和拆除连接和身份验证的代价。它很方便,因为您不需要记住清理任何东西。
切换到New-PSSession
原始问题中的 as 可以提供更持久的连接,可以反复使用,指定-Session
而不是ComputerName
。为了获得良好的资源卫生,您需要在完成后删除会话。我通常使用模式try/finally
。
无论哪种情况,都可以在 中完成工作ScriptBlock
。您可以$using:text | Out-File c:\website\company.txt
在块内执行。using
范围限定符允许您从调用上下文中引用变量。
答案2
抱歉,这将是一个有点垃圾的答案,但我最终放弃了整个事情并重新开始,而不是创建变量然后将其传递等等。它现在在本地机器上创建文本文件,然后通过 FTP 将其传输到服务器,这是更简单的方法。如果你想让我上传我现在使用的代码,我会的,但直到你感兴趣之前,我暂时不上传。感谢大家的帮助