использование команды вызова для создания файлов на удаленном сервере

Я новичок в powershell и всевозможных сценариях, и мне пришлось выполнить следующую задачу.

Мне нужно создать файл на удаленном сервере на основе имени файла, полученного на локальном сервере с помощью команды вызова.

WinRM настроен и работает на удаленном сервере.

Что мне нужно сделать, так это следующее

На сервере Server1 находится папка с триггерным файлом. Powershell на сервере Server1 передает имя файла в powershell на сервере Server2. Затем Powershell на сервере Server2 создает файл на основе имени.

Мои головы растаяли, просматривая формы в поисках вдохновения, любая помощь будет принята с благодарностью.

Большое спасибо Пол


person Liffeyman    schedule 23.02.2018    source источник
comment
Не уверен, кто прокомментировал этот вопрос, но я пытаюсь писать удаленные файлы с помощью Powershell, что очень похоже на этот вариант использования, спасибо за публикацию @Liffeyman   -  person fusion27    schedule 05.10.2020


Ответы (1)


Я думаю, что если вы новичок в написании сценариев, вам будет очень сложно хранить и обрабатывать учетные данные для Invoke-Command. Было бы проще, если бы вы могли создать общую папку на сервере Server2 и записать в нее только один сценарий PowerShell.

В любом случае довольно простой подход — это запланированная задача на сервере Server1, которая запускает сценарий PowerShell с собственной учетной записью пользователя службы каждые 5 минут.

Скрипт делает что-то вроде:

# 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
}

(Не проверено)

person TessellatingHeckler    schedule 23.02.2018
comment
Большое спасибо за это, если вы еще в Дублине, дайте мне знать, и я куплю вам пинту - person Liffeyman; 23.02.2018
comment
Привет TessellatingHeckler С файлом триггера, если бы я хотел удалить порядковый номер из конца файла, что мне нужно было бы добавить/удалить из $newFileName = $triggerFile.Name.Substring(1) Большое спасибо, Пол - person Liffeyman; 27.02.2018
comment
@Liffeyman Я собираюсь сказать регулярное выражение, и это будет выглядеть как каракули, но если файл похож на триггер 123.txt, то что-то вроде этого $newFileName = $triggerFile.Name -replace '\s*\d+(?=\.)' сделает его trigger.txt. Если у него нет расширения и это просто trigger123, то -replace '\s*\d+$' просто брать числа с конца. Надеюсь, кто-то из них это сделает. - person TessellatingHeckler; 28.02.2018