Скомпилируйте Micro Focus Net Express 5.1 Cobol в Powershell - PullRequest
0 голосов
/ 07 апреля 2020

Я надеюсь, что кто-нибудь сможет помочь мне с написанием команды компиляции COBOL MF Net Express 5.1 в Powershell. У меня есть команда, как она использовалась в оригинальном пакетном скрипте. В настоящее время я работаю над переработкой этого в Powershell в качестве сценария сборки.

COBOL.EXE "%%inFile%%" OUTDD NOERRQ NOFLAGQ NOQUERY noALTER noanim nobound checkdiv COMP errlist list() FASTLINK omf"gnt" perform-type"osvs" SCHEDULER TARGET"PENTIUM" noTRUNC vsc2(1) listpath"","%%OUTPUT%%";,;,;

Моя попытка преобразовать это в Powershell была такой:

$cobolExe = ".\COBOL.EXE"
$expression = "& $cobolExe `"$($inputfile)`" OUTDD NOERRQ NOFLAGQ NOQUERY noALTER noanim nobound checkdiv COMP errlist list() FASTLINK omf`"gnt`" perform-type`"osvs`" SCHEDULER TARGET`"PENTIUM`" noTRUNC vsc2(1) listpath`"`", `"$binPath\`";,;,;"
Invoke-Expression $expression

Invoke-Expression: 
Line |
   1 |  Invoke-Expression $expression
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | At line:1 char:97 + … GQ NOQUERY noALTER noanim nobound checkdiv COMP errlist list() FASTLI … +                                                                ~
An expression was expected after '('.  At line:1
     | char:221 + … NTIUM" noTRUNC vsc2(1) listpath"", "C:\dev\dimensions\test\bin\";,;,; +                                                                     ~
Missing expression after unary operator ','.  At line:1
     | char:223 + … NTIUM" noTRUNC vsc2(1) listpath"", "C:\dev\dimensions\test\bin\";,;,; +                                                                       ~
Missing expression after unary operator ','.

Я успешно работал с CBLLINK.EXE, но для этого не требуется столько параметров.

$cobolFile = "$Path\cobol.dir"
$cbllinkExe = ".\CBLLINK.EXE"

$expression = "$cbllinkExe -s -o$($outputFile) `"$($inputFile)`" adis adisinit adiskey -u`"$cobolFile`""
Invoke-Expression $expression

Любой, кто может иметь какое-либо понимание и может оказать некоторую помощь, я был бы очень признателен. Пожалуйста, дайте мне знать, если я могу предоставить что-нибудь еще?

1 Ответ

1 голос
/ 15 апреля 2020

Для вызова внешних exe / cmd через PowerShell требуется особое внимание c. Это хорошо документированная вещь.

См. Эти сведения от Microsoft и других организаций: ---

PowerShell: запуск исполняемых файлов

Оператор вызова &
# Example:
& 'C:\Program Files\Windows Media Player\wmplayer.exe' "c:\videos\my home video.avi" /fullscreen

Вещи могут быть сложными, когда во внешней команде много параметров или в аргументах или путях есть пробелы!

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

В этом случае лучше все разделить так:

$CMD = 'SuperApp.exe'
$arg1 = 'filename1'
$arg2 = '-someswitch'
$arg3 = 'C:\documents and settings\user\desktop\some other file.txt'
$arg4 = '-yetanotherswitch'

& $CMD $arg1 $arg2 $arg3 $arg4

# or same like that:
$AllArgs = @('filename1', '-someswitch', 'C:\documents and settings\user\desktop\some other file.txt', '-yetanotherswitch')
& 'SuperApp.exe' $AllArgs
cmd / c - Использование старой оболочки cmd ** Этот метод больше не следует использовать с V3

Зачем: обходит PowerShell и запускает команду из оболочки cmd. Часто используется с DIR, который работает быстрее в оболочке cmd, чем в PowerShell (ПРИМЕЧАНИЕ. Это была проблема с PowerShell v2 и его использованием. Net 2.0, это не проблема с V3).

Подробности: открывает приглашение CMD из powershell, а затем выполняет команду и возвращает текст этой команды. / c сообщает CMD, что он должен завершиться после завершения команды. Нет никаких оснований использовать это с V3.

# Example:
#runs DIR from a cmd shell, DIR in PowerShell is an alias to GCI. This will return the directory listing as a string but returns much faster than a GCI
cmd /c dir c:\windows

Использование Windows PowerShell для запуска старых инструментов командной строки (и их самых странных параметров)

Решение 2A: Используйте CMD / C

Как и в случае с первой проблемой, вы можете запустить сам CMD.EXE и передать вашу команду и ее параметры в кавычках. Помимо эффективности, это будет работать нормально, так как PowerShell не будет пытаться анализировать строку в кавычках.

CMD.EXE /C "ICACLS.EXE C:TEST /GRANT USERS:(F)"

<#
# Results

processed file: C:TEST
Successfully processed 1 files; Failed processing 0 files
#>

.. есть еще подобные.

...