我喜欢在我的cmd.exe脚本中有一个典型的"usage:"行- 如果缺少一个参数,用户可以简单地提醒我们如何使用脚本.
问题是我无法安全地预测潜在用户是否会使用GUI或CLI.如果有人使用GUI在资源管理器窗口中双击此脚本,他们就没有机会阅读任何内容,除非我pause在窗口中.如果他们使用CLI,pause会打扰他们.
所以我正在寻找一种方法来检测它.
@echo off
if _%1_==__ (
echo usage: %nx0: filename
rem now pause or not to pause?
)
Run Code Online (Sandbox Code Playgroud)
有一个很好的解决方案吗?
定义一个工作构建任务的tasks.json(当前唯一一个,定义为默认且工作正常,也由[CTRL]+[SHIFT]+[B]触发)。
它触发外部命令(批处理/shell 脚本)并传递一些参数。摘抄:
{
"label": "sample task",
"windows": {
"command": "${workspaceFolder}\\procedures_win\\doStuff.bat"
},
"linux": {
"command": "${workspaceFolder}/procedures/doStuff.sh"
},
"type": "shell",
"args": [
"fixedParm",
"${fileBasename}"
]
}
Run Code Online (Sandbox Code Playgroud)
(完整的较长,主要是因为 ProblemMatcher 中的条目数量较多,包含目标特定环境设置,100 行+ ...)
创建第二个任务“示例任务(仅检查)”,该任务完全相同,但向脚本传递一个额外参数"check-only"。
是否可以“扩展”给定的任务,仅“覆盖” args?
如果不是:是否可以让一个任务实际运行(不依赖于)另一个任务并设置一个环境参数,然后原始任务可以将其用作"${env:someValue}"(将导致空字符串或请求的“仅检查” ”)?
作为最后的手段,可以定义 5 个而不是两个任务(1 与当前任务几乎相同,但从外部命令/文件获取输入;2+3 元任务取决于 4+5、4+5 命令,创建一个${workspaceFolder}/.taskmode不包含任何内容或“仅检查”的文件)。
不安装扩展的工作解决方案是什么样子的?
我正在使用OpenProcess从 PID 获取进程句柄。函数应该做的两个任务是:
WaitForSingleObject (process, INFINITE)GetExitCodeProcess (process, &ret)问:是否有可能得到ERROR_ACCESS_DENIED的PROCESS_QUERY_LIMITED_INFORMATION,但不是SYNCHRONIZE?如果是:哪种情况?
我的完整代码供参考:
/* wait for a pid to end and return its exit code
error codes are returned as negative value
*/
int
waitpid (const int pid)
{
int status = 0;
HANDLE process = NULL;
DWORD ret;
/* windows will wait for the own process to end... abort */
if (pid == _getpid ()) {
status = 0 - …Run Code Online (Sandbox Code Playgroud) 我需要将我在 .cobc 文件中编写的程序编译为 Windows 可执行文件。该文件名为 main.cobc
使用以下命令进行编译: cobc -x -free *.cobc -o main
使其成为 Linux 可执行文件,这是可以的,但不能直接在 Windows 上运行。
我在我的 linux ubuntu 虚拟机上安装了 gnucobol (OpenCOBOL)。
请帮忙。有没有办法以与 Windows 兼容的方式编译它?
提前致谢!
我需要在服务器上调试程序,并且希望在 GDB 中保留其输出。一般而言,以下“作品”:
gdbserver --multi :12345"set sysroot remote:", "target extended-remote myserver:12345", "set remote exec-file /path/to/myfile", "run"我知道看到程序在断点上运行和停止,在集成终端中查看程序的输出,并且可以切换到调试控制台。但是如何才能同时看到调试控制台和集成终端呢?
如果可能的话,我不想对其中一个窗口使用外部窗口,因为打开了多个 vscode 实例 - 每个实例都连接到不同的服务器 - 并且多个窗口“神奇地”属于彼此将使调试变得更加困难 -集成选项彻底解决了这个问题。
如何在GnuCOBOL中启动子进程?
在Node.js的,我们可以使用spawn或exec启动子进程:
var proc = require("child_process").spawn("ls", ["-l"]);
proc.stdout.on("data", function (chunk) {
console.log(chunk);
});
// or
var proc = require("child_process").exec("ls -l"], function (err, stdout, stderr) {
...
});
Run Code Online (Sandbox Code Playgroud)
上面的两个例子都运行ls -l(列出文件和目录).如何在COBOL中实现同样的目标?
给出:带有入口点的prog.c prog
我通常会
cl.exe /MD /LD /Fe"prog.dll" /Fo"prog" "prog.c" /link ext.lib
Run Code Online (Sandbox Code Playgroud)
要么
cl.exe /MD /Fo"prog.obj"
cl.exe /MD /LD /Fe"prog.dll" "prog.obj" /link ext.lib
Run Code Online (Sandbox Code Playgroud)
在两种情况下,生成的prog.dll都可以正常工作。
现在,我执行以下操作来获取一个asm文件而不是obj文件:
cl.exe /c /MD /Fa"prog"
Run Code Online (Sandbox Code Playgroud)
到目前为止,这个“工作”也是如此。但我不知道如何制作此文件的dll。
尝试过:
ml.exe /c /Cx /coff prog.asm
cl.exe /MD /LD /Fe"prog.dll" "prog.obj" /link ext.lib
Run Code Online (Sandbox Code Playgroud)
结果:没有入口点的prog.dll prog
再次尝试:
ml.exe /c /Cx /coff prog.asm
cl.exe /MD /LD /Fe"prog.dll" "prog.obj" /link /entry:prog ext.lib
Run Code Online (Sandbox Code Playgroud)
结果:编译器警告错误的入口点_prog不能用12个字节的参数进行stdcall以及有关未解析符号_memcpy的编译器错误。
问题:有什么方法可以将由/ Fa生成的cl.exe生成的asm文件编译为dll(最好是通过cl.exe,如果不能使用ml.exe编译)?
我在Windows 10上使用OpenCobolIDE 4.7.4(它基于GnuCOBOL)并尝试编译该程序打开一个文件进行阅读:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO 'input.txt'
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD STUDENT.
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(5).
05 NAME PIC A(25).
WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
01 WS-EOF PIC A(1).
PROCEDURE DIVISION.
OPEN INPUT STUDENT.
PERFORM UNTIL WS-EOF='Y'
READ STUDENT INTO WS-STUDENT
AT END MOVE 'Y' TO WS-EOF
NOT AT END DISPLAY WS-STUDENT
END-READ
END-PERFORM.
CLOSE …Run Code Online (Sandbox Code Playgroud) 在这段代码中,我想ACCEPT和DISPLAY01级D变量.虽然05级D很容易,D OF F有没有办法指定01级D?
显而易见的解决方案是"只需更改变量名称",但希望有更好的方法!
IDENTIFICATION DIVISION.
PROGRAM-ID. DISAMBIGUATION-ISSUE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 D VALUE PIC 9(8).
01 F.
05 Y PIC 9(4).
05 M PIC 9(2).
05 D PIC 9(2).
PROCEDURE DIVISION.
*> Errors here, D is ambiguous
ACCEPT D.
DISPLAY "Date: " D.
STOP RUN.
Run Code Online (Sandbox Code Playgroud) 使用此 COBOL 代码:
IDENTIFICATION DIVISION.
PROGRAM-ID. DBNULLA.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE PATIENT
END-EXEC.
PROCEDURE DIVISION.
MAIN-PARA.
DISPLAY 'SAMPLE STRUCTURE OF COBOL DB2 PRORGRAM'.
DISPLAY 'WE ARE CHECKING NULL HERE '.
MOVE 100 TO PAT-ID.
EXEC SQL
SELECT PAT_ID,PAT_NAME,WARD_NAME INTO :PAT-ID,:PAT-NAME,
:WARD-NAME FROM PATIENT WHERE PAT_ID = :PAT-ID
END-EXEC.
IF SQLCODE = 0
DISPLAY 'HI'
ELSE
DISPLAY 'EMBEDDED SQL SQLCODE:' SQLCODE
END-IF.
STOP-RUN.
Run Code Online (Sandbox Code Playgroud)
执行时我得到以下输出:
SAMPLE STRUCTURE OF COBOL DB2 PRORGRAM
WE ARE CHECKING …Run Code Online (Sandbox Code Playgroud) cobol ×4
gnucobol ×3
assembly ×1
batch-file ×1
c ×1
cmd ×1
db2 ×1
linux ×1
mainframe ×1
masm ×1
process ×1
visual-c++ ×1
vscode-tasks ×1
winapi ×1
windows ×1