使用 invoke-command 在远程服务器上创建文件
using invoke-command to create files on a remote server
我是 powershell 和各种脚本的新手,已经完成了以下任务。
我需要根据使用 invoke-command 在本地服务器上获取的文件名在远程服务器上创建一个文件。
WinRM 已配置并且 运行 在远程服务器上。
我需要发生的事情如下
Server1 上放置了一个触发器文件文件夹。 Server1 上的 Powershell 将文件名传递到 Server2 上的 powershell。 Server2 上的 Powershell 然后根据名称创建一个文件。
我的脑袋被融化了,通过表格寻找灵感,任何帮助将不胜感激
非常感谢
保罗
我认为如果您是脚本编写新手,存储和处理 Invoke-Command
的凭据会增加很多额外的复杂性。如果您可以在 Server2 上创建一个共享文件夹并且只用一个 PowerShell 脚本写入该文件夹,那就更容易了。
无论哪种方式,一个相当简单的方法是在 Server1 上执行计划任务,它每 5 分钟使用自己的服务用户帐户运行一个 PowerShell 脚本。
脚本执行如下操作:
# Check the folder where the trigger file is
# assumes there will only ever be 1 file there, or nothing there.
$triggerFile = Get-ChildItem -LiteralPath "c:\triggerfile\folder\path"
# if there was something found
if ($triggerFile)
{
# do whatever your calculation is for the new filename "based on"
# the trigger filename, and store the result. Here, just cutting
# off the first character as an example.
$newFileName = $triggerFile.Name.Substring(1)
# if you can avoid Invoke-Command, directly make the new file on Server2
New-Item -ItemType File -Path '\server2\share\' -Name $newFileName
# end here
# if you can't avoid Invoke-Command, you need to have
# pre-saved credentials, e.g. https://www.jaapbrasser.com/quickly-and-securely-storing-your-credentials-powershell/
$Credential = Import-CliXml -LiteralPath "${env:\userprofile}\server2-creds.xml"
# and you need a script to run on Server2 to make the file
# and it needs to reference the new filename from *this* side ("$using:")
$scriptBlock = {
New-Item -ItemType File -Path 'c:\destination' -Name $using:newFileName
}
# and then invoke the scriptblock on server2 with the credentials
Invoke-Command -Computername 'Server2' -Credential $Credential $scriptBlock
# end here
# either way, remove the original trigger file afterwards, ready for next run
Remove-Item -LiteralPath $triggerFile -Force
}
(未测试)
我是 powershell 和各种脚本的新手,已经完成了以下任务。
我需要根据使用 invoke-command 在本地服务器上获取的文件名在远程服务器上创建一个文件。
WinRM 已配置并且 运行 在远程服务器上。
我需要发生的事情如下
Server1 上放置了一个触发器文件文件夹。 Server1 上的 Powershell 将文件名传递到 Server2 上的 powershell。 Server2 上的 Powershell 然后根据名称创建一个文件。
我的脑袋被融化了,通过表格寻找灵感,任何帮助将不胜感激
非常感谢 保罗
我认为如果您是脚本编写新手,存储和处理 Invoke-Command
的凭据会增加很多额外的复杂性。如果您可以在 Server2 上创建一个共享文件夹并且只用一个 PowerShell 脚本写入该文件夹,那就更容易了。
无论哪种方式,一个相当简单的方法是在 Server1 上执行计划任务,它每 5 分钟使用自己的服务用户帐户运行一个 PowerShell 脚本。
脚本执行如下操作:
# Check the folder where the trigger file is
# assumes there will only ever be 1 file there, or nothing there.
$triggerFile = Get-ChildItem -LiteralPath "c:\triggerfile\folder\path"
# if there was something found
if ($triggerFile)
{
# do whatever your calculation is for the new filename "based on"
# the trigger filename, and store the result. Here, just cutting
# off the first character as an example.
$newFileName = $triggerFile.Name.Substring(1)
# if you can avoid Invoke-Command, directly make the new file on Server2
New-Item -ItemType File -Path '\server2\share\' -Name $newFileName
# end here
# if you can't avoid Invoke-Command, you need to have
# pre-saved credentials, e.g. https://www.jaapbrasser.com/quickly-and-securely-storing-your-credentials-powershell/
$Credential = Import-CliXml -LiteralPath "${env:\userprofile}\server2-creds.xml"
# and you need a script to run on Server2 to make the file
# and it needs to reference the new filename from *this* side ("$using:")
$scriptBlock = {
New-Item -ItemType File -Path 'c:\destination' -Name $using:newFileName
}
# and then invoke the scriptblock on server2 with the credentials
Invoke-Command -Computername 'Server2' -Credential $Credential $scriptBlock
# end here
# either way, remove the original trigger file afterwards, ready for next run
Remove-Item -LiteralPath $triggerFile -Force
}
(未测试)