Перенаправление вывода .bat при использовании Invoke-Command - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь перенаправить вывод скрипта .bat в файл.Сценарий запускается на другом компьютере.

Комментированная строка работает.Файл t.txt создается в ожидаемом месте.Я не могу убедить PowerShell создать выходной файл при использовании ScriptBlock.

Текущий результат заключается в том, что текст $ sb выводится на консоль PowerShell, выполняющую этот сценарий.На сервере SERVER2 не создается файл.Что мне нужно, чтобы выходные данные были записаны в файл, указанный в блоке скриптов?

$cn = 'SERVER2'
$Logfile = "D:\DBA\Scripts\monlogs\monlog_$(Get-Date -Format 'yyyy-MM-ddTHH-mm-ss').txt"
$sb = [scriptblock]::Create("{ & cmd.exe /C D:\DBA\Scripts\mon_test_001.bat >`"$Logfile`" }")
### Invoke-Command -ComputerName $cn -ScriptBlock { & D:\DBA\Scripts\mon_test_001.bat >D:\DBA\Scripts\monlogs\t.txt 2>&1 }
Invoke-Command -ComputerName $cn -ScriptBlock $sb

EDIT

После комментария BenH я обнаружил, что следующее работает какожидается.Обратите внимание, что параметр должен был экранировать $.

$sb = [scriptblock]::Create("param(`$Logfile) & cmd.exe /C D:\DBA\Scripts\mon_test_001.bat >`"$Logfile`"")

1 Ответ

0 голосов
/ 31 мая 2018

Вместо метода создания класса, может быть, приведение будет работать?Затем, поскольку вы запускаете блок сценариев на удаленном компьютере, используйте область «$ using:» для локальной переменной.(PSv3 + и выше)

$cn = 'SERVER2'
$Logfile = "c:\temp\$(Get-Date -Format 'yyyy-MM-ddTHH-mm-ss').txt"
[scriptblock]$sb = { & cmd.exe /C c:\temp\test.bat > "$using:Logfile" }
Invoke-Command -ComputerName $cn -ScriptBlock $sb

В противном случае для более ранних версий вам потребуется использовать блок param и -ArgumentList:

[scriptblock]$sb = {param($logpath) & cmd.exe /C c:\temp\test.bat > "$logpath" }
Invoke-Command -ComputerName $cn -ScriptBlock $sb -ArgumentList $Logfile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...