Как передать параметры, содержащие знак доллара, в программу в Powershell? / Проблемы с удаленным подключением - PullRequest
1 голос
/ 01 ноября 2019

Я недавно начал изучать Powershell. Моя проблема в том, что я пытаюсь запустить скрипт powershell, чтобы разморозить удаленный компьютер, но один из параметров Time Freeze содержит знак доллара. Как мне это сделать?

По сути, мне нужно выполнить следующую команду:

cmd.exe /c "C:\Program Files\Toolwiz Time Freeze 2017\ToolwizTimeFreeze.exe" /unfreeze /usepass=$password

Где знак доллара является частью пароля. Если я запускаю его на консоли powershell непосредственно на удаленном компьютере, он работает (мне просто нужно добавить одинарные кавычки вокруг $ password) . Но когда я пытаюсь запустить скрипт с моего локального компьютера, он застревает на нем, и мне нужно отменить его, нажав Ctrl C.

Сценарий, о котором идет речь, таков:

$User = "user"
$PWord = ConvertTo-SecureString "password" -AsPlainText -Force
$Ip = Read-Host -Prompt 'Insira o IP da maquina de destino:'
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord
$sess = New-PSSession -Credential $Cred -ComputerName $Ip

Enter-PSSession $sess

Invoke-Command -ComputerName $Ip -ScriptBlock { cmd.exe /c "C:\Program Files\Toolwiz Time Freeze 2017\ToolwizTimeFreeze.exe" /unfreeze /usepass=$password} -Credential $Cred

Remove-PSSession $sess
Exit-PSSession

Я попытался использовать Start-Process -Filepath и & для запуска Time Freeze, но он также не работает (скрипт выполняется, но ничего не происходит), но когда я пытаюсь запустить другие команды, такие как создание новой папки на пультемашина или перезапуск, он работает отлично.

Я не знаю, что еще попробовать.

Edit1: я пытался передать параметр в одинарных кавычках, и я также пыталсяиспользуя -argumentlist, но он тоже не работает.

Edit2: если я запускаю скрипт локально, он отлично работает, даже на удаленной машине. Но когда я пытаюсь запустить его удаленно, это не работает. Это кажется мне очень странным, потому что я могу успешно запускать другие команды удаленно, но с этим у меня проблемы.

Ответы [ 3 ]

0 голосов
/ 01 ноября 2019

Если возможно, попробуйте обернуть все передаваемые аргументы cmd.exe в переменную перед вызовом Invoke-Command. Затем вы можете передать переменную через -ArgumentList.

. Вот небольшой пример, где я помещаю все свои аргументы в переменную $params и затем передаю ее в ScriptBllock из InvokeCommand. Обратите внимание, что вам нужно добавить раздел param() вверху, чтобы принять переменную, которую вы передаете через -ArgumentList.

$params = @("/c ipconfig /all")
Invoke-Command -ComputerName $Computer -Credential $Cred -ScriptBlock { 
    param(
        $params
    )
    Write-Host "We passed in the following parameters: '$params'"
    & "cmd.exe" $params 
} -ArgumentList $params
0 голосов
/ 01 ноября 2019

Если вы запускаете это из PowerShell, вам нужно заключить кавычки в значения со пробелами и экранировать знак доллара в PowerShell и CMD.

$sb = { cmd.exe /c """C:\Program Files\Toolwiz Time Freeze 2017\ToolwizTimeFreeze.exe"" /unfreeze /usepass=\`$password"}
Invoke-Command -ComputerName $Ip -ScriptBlock $sb -Credential $Cred
0 голосов
/ 01 ноября 2019

Вы пытались экранировать $ в пароле?:

/usepass="`$password"

Не представляете, работает ли это, если нет, вы можете присвоить пароль переменной, а затем указать это в качестве аргумента

* 1005. *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...