我需要从文件中获取特定的版本字符串(称之为version.lst)并使用它来比较shell脚本中的另一个.例如,该文件包含如下所示的行:
V1.000 -- build date and other info here -- APP1
V1.000 -- build date and other info here -- APP2
V1.500 -- build date and other info here -- APP3
Run Code Online (Sandbox Code Playgroud)
.. 等等.假设我试图从APP1获取第一个版本(在本例中为V1.000).显然,版本可以改变,我希望它是动态的.我现在所做的工作:
var = `cat version.lst | grep " -- APP1" | grep -Eo V[0-9].[0-9]{3}`
Run Code Online (Sandbox Code Playgroud)
管道到grep将获得包含APP1的行,第二个管道到grep将获得版本字符串.但是,我听说grep不是这样做的,所以我想学习使用awk或sed的最佳方法.有任何想法吗?我是两个新手,并没有找到足够简单的教程来学习它的语法.他们支持egrep吗?谢谢!
简而言之,创建卸载条目的方法如下:
<Shortcut Id="UninstallProduct"
Name="Uninstall My Application"
Target="[SystemFolder]msiexec.exe"
Arguments="/x [ProductCode]"
Description="Uninstalls My Application" />
Run Code Online (Sandbox Code Playgroud)
根据罗布Mensching的建议在这里,如果应用程序是足够小,你不需要处理小更新和次要升级(我不),你可以强制每次更新是一个重大的升级.这在这里显示.我用Rob的建议是这样的:
<Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="$(var.ProductVersion)">
<Upgrade Id="PUT-GUID-HERE">
<UpgradeVersion OnlyDetect="yes" Minimum="$(var.ProductVersion)" Property="NEWERVERSIONDETECTED" IncludeMinimum="no" />
<UpgradeVersion OnlyDetect="no" Maximum="$(var.ProductVersion)" Property="OLDERVERSIONBEINGUPGRADED" IncludeMaximum="no" />
</Upgrade>
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,如果产品ID是随机的(*)以允许进行重大升级,是否有其他方法可以将卸载快捷方式添加到开始菜单,还是我们必须通过添加/删除程序来实现?我更喜欢在开始菜单中创建快捷方式,因为它对用户来说更容易.显然它现在的方式,它将无法工作,因为msiexec参数中使用的[ProductCode]将在每次安装时更改.谢谢.
我是C的新手并编写TCP服务器,并且想知道如何从发送服务器将响应的命令的客户端处理recv().为了这个问题,我们只说头是第1个字节,命令标识符是第2个字节,有效载荷长度是第3个字节,然后是有效载荷(如果有的话).
recv()这些数据的最佳方法是什么?我想调用的recv()在第3个字节到缓冲区中读取,检查以确保标题和指令标识符有效,然后检查有效载荷长度与有效载荷长度的长度再次调用的recv(),这增加了回到前面提到的缓冲区.阅读Beej的网络文章(尤其是本节在这里:http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#sonofdataencap),然而,他建议用"足够大的数组两[最大"数据包"处理诸如获取下一个数据包之类的情况.
处理这些类型的recv()的最佳方法是什么?基本的问题,但我想高效地实现它,处理可能出现的所有情况.提前致谢.
我想知道用C90初始化这个结构的最好方法是什么,同时仍保持整洁.
在我的头文件中,将其命名为test.h,我定义了以下结构:
struct s_test_cfg{
char *a[3];
char *b[3];
char *c[3];
}
Run Code Online (Sandbox Code Playgroud)
然后我将它声明为extern结构,以便我可以在.c文件中全局初始化它:
extern struct s_test_cfg test_cfg;
Run Code Online (Sandbox Code Playgroud)
现在在我的.c文件中,我希望能够在全局范围内声明这样的东西(很明显我要编写的内容在C90中不受支持):
struct s_test_cfg test_cfg =
{ .a = {"a", "b", "c"},\
.b = {"d", "e", "f"},\
.c = {"g", "h", "i"} };
Run Code Online (Sandbox Code Playgroud)
这显然使你对你想要做的事情非常整洁和透明.如何初始化我的C文件中的全局结构,该结构也像这种语法一样干净?谢谢.