我希望有人能帮助我在Powershell中编写COBOL MF Net Express 5.1编译命令。我有一个原始批处理脚本中使用的命令。我目前正在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:devdimensionstestbin";,;,; + ~
Missing expression after unary operator ','. At line:1
| char:223 + … NTIUM" noTRUNC vsc2(1) listpath"", "C:devdimensionstestbin";,;,; + ~
Missing expression after unary operator ','.
我成功地使用了CBLLINK.EXE,但它不需要那么多参数。
$cobolFile = "$Pathcobol.dir"
$cbllinkExe = ".CBLLINK.EXE"
$expression = "$cbllinkExe -s -o$($outputFile) `"$($inputFile)`" adis adisinit adiskey -u`"$cobolFile`""
Invoke-Expression $expression
任何有任何见解并能提供帮助的人,我都将不胜感激。如果我能提供其他帮助,请告诉我?
通过PowerShell调用外部exe/cmd需要特别注意。这是一件有据可查的事情。
请参阅微软和其他公司的详细信息:---
PowerShell:运行可执行文件
- 呼叫接线员&
# Example:
& 'C:Program FilesWindows Media Playerwmplayer.exe' "c:videosmy home video.avi" /fullscreen
当外部命令有很多参数时,事情可能会变得棘手或者参数或路径中有空格!
有了空格,你必须嵌套引号,结果不是始终保持畅通!
在这种情况下,最好像这样分离所有内容:
$CMD = 'SuperApp.exe'
$arg1 = 'filename1'
$arg2 = '-someswitch'
$arg3 = 'C:documents and settingsuserdesktopsome other file.txt'
$arg4 = '-yetanotherswitch'
& $CMD $arg1 $arg2 $arg3 $arg4
# or same like that:
$AllArgs = @('filename1', '-someswitch', 'C:documents and settingsuserdesktopsome other file.txt', '-yetanotherswitch')
& 'SuperApp.exe' $AllArgs
- cmd/c-使用旧的cmd shell**此方法不应再与V3一起使用
原因:绕过PowerShell并从cmd shell运行命令。经常与DIR一起使用的次数,DIR在cmd shell中的运行速度比在PowerShell(注意:这是PowerShell v2及其使用的问题.Net 2.0,这不是V3的问题(。
详细信息:从powershell中打开CMD提示符,然后执行命令,并返回该命令的文本。/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
#>
还有更多类似的。