2015-07-23 2 views
1

Я пытаюсь написать и выполнить сценарий .cmd в powershell. Код у меня есть для этого:Запуск сценария .cmd/.bat в Powershell

$script = @' 
@echo off 
SETLOCAL 

CALL something here 
'@ 

Invoke-Expression -Command: $script 

Это базируется this link, объясняющую here string в PowerShell. Он находится внизу ссылки. Вот the related msdn.

Это another related link человеку, который пытается сделать то же самое.

я получаю сообщение об ошибке, что связано с включением оператора «@» в строке:

Invoke-Expression : At line:1 char:7 
+ @echo off 
+  ~~~ 
Unexpected token 'off' in expression or statement. 
At line:1 char:1 
+ @echo off 
+ ~~~~~ 
The splatting operator '@' cannot be used to reference variables in an expression. '@echo' can be used only as an argument to a command. To reference variables in an expression use '$echo'. 

Я пытался уйти от символа «@», и множество других вещей. Я хотел бы знать, почему он, похоже, работал на них в третьей ссылке, но бросает эту ошибку в моем случае.

Edit: Записи в BAT-файл затем запустить файл летучей мыши в результате те же ошибки:

$batchFileContent = @' 
@echo off 
c:\windows\system32\ntbackup.exe backup "C:\Documents and Settings\Administrator\Local Settings\Application Data\Microsoft\Windows NT\NTBackup\data\chameme.bks" /n "1file.bkf1 created 06/09/2013 at 09:36" /d "Set created 06/09/2013 at 09:36" /v:no /r:no /rs:no /hc:off /m normal /j chameme /l:s /f "\\fs1\Exchange Backups$\1file.bkf" 
'@ 

$batchFileContent | Out-File -LiteralPath:"$env:TEMP\backup.cmd" -Force 

Invoke-Expression -Command:"$env:TEMP\backup.cmd" 

Remove-Item -LiteralPath:"$env:TEMP\backup.cmd" -Force 

Как Билл Стюарт отметил, что я должен написать содержание CMD-скрипта в Powershell.

Edit: Это

$script = @' 
cmd.exe /C "@echo off" 
cmd.exe /C "SETLOCAL" 

cmd.exe /C "CALL something here" 
'@ 

Invoke-Expression -Command: $script 

Кажется, работает.

+3

Почему вы должны сделать это? Просто делайте то, что вам нужно сделать в PowerShell напрямую. –

+0

Invoke-Expression будет вызывать команды ** Powershell **. Чтобы выполнить пакетные команды, сохраните их в пакетном файле и выполните cmd.exe с этим файлом в качестве параметра. В качестве альтернативы вы можете ввести сеанс cmd.exe в powershell, а затем выполнить отдельные команды. – EBGreen

+1

@Bill_Stewart. Я был так настойчив в поиске способа запуска скрипта, что я не думал, что у меня есть полномочия. На данный момент мне любопытно, почему это не работает для меня, хотя я, вероятно, в конечном итоге использую powershell вместо этого. – Speerian

ответ

2

Это происходит потому, что Invoke-Expression интерпретирует вашу строку с помощью PowerShell. PowerShell позволяет запускать команды оболочки, но сначала интерпретирует их как PowerShell. Символ @ является оператором splatting в PowerShell.

Вы должны сохранить команды в пакетном файле, а затем выполнить это.

Или вы можете выполнять команды однострочных обстрела к cmd.exe:

Invoke-Expression "cmd.exe /c @echo something" 
Смежные вопросы