我有这个想法,我应该从cmd.exe切换到powershell.它比经过试验和测试的cmd.exe强大得多.它是Windows的未来之壳.
但与powersd.exe相比,我在powershell中的设施非常有限.在每个角落,我发现了另一个看似无法克服的小障碍.
今天我尝试使用ctrl-C来停止正在运行的程序,在PowerShell中,它没有任何效果.??
上次通过它是"如何在powershell中做一个'dir/o'?" 我知道如何在.cmd脚本中进行循环,我如何在PowerShell中执行此操作?
我需要一些建议:首先,尝试切换到PowerShell是个好主意吗?
如果是这样,问题2是:您对如何打破cmd.exe习惯的建议是什么?
相关:
我应该在我的应用程序中包含命令行模式吗?
如何获取父进程标准输出?
控制台应用程序可以检测它是否已从资源管理器运行?
我想构建一个控制台应用程序,通常从命令行运行.
但是,当它从资源管理器中双击(而不是从cmd.exe提示符运行)时,我希望该程序不显示控制台窗口.
我想避免这个:
替代文字http://i36.tinypic.com/1088p5s.jpg
可能吗?
编辑我想另一种问题是,程序是否有可能知道它是如何被调用的 - 无论是通过双击还是通过命令行?
我在Windows上使用.NET.
编辑2:从这篇Old New Thing博客文章中我学到了一些好东西.这就是我现在所知道的......
在Windows中,EXE文件标记为GUI或非GUI.使用csc.exe,可以使用/target:winexe或选择它/target:exe.在执行流程中的第一条指令之前,Windows内核会设置执行环境.此时,如果EXE标记为GUI,则内核将进程的stdin/stdout设置为NULL,如果非GUI(命令行),则内核创建控制台并将进程的stdin/stdout设置为安慰.
启动进程时,如果没有stdin/stdout(== /target:winexe),则立即返回调用.因此,从cmd.exe启动gui应用程序,您将立即返回cmd提示符.如果存在stdin/stdout,并且从cmd.exe运行,则父cmd.exe将等待进程退出.
"立即返回"很重要,因为如果您编写GUI应用程序以附加到其父控制台,您将能够执行console.writeline等.但cmd.exe提示是活动的.用户可以键入新命令,启动新进程等.换句话说,从winexe,只需附加到父控制台,AttachConsole(-1)不会"变成"控制台应用程序.
此时我认为允许应用程序使用控制台的唯一方法是从cmd.exe调用它,而不是在双击时使用它,就是将exe定义为常规控制台exe(/target:exe),并且如果合适,在启动时隐藏窗口.您仍然会暂时显示控制台窗口.
我仍然没有想过如何知道它是从explorer或cmd.exe启动的,但我越来越近了..
解答
无法构建不显示控制台窗口的控制台应用程序.
这是可能的构建非常迅速隐藏其窗口控制台应用程序,但不能如此之快,这是因为如果从来没有出现的窗口.
现在,为了确定是否从资源管理器启动了一个控制台应用程序,有些人建议查看它正在运行的控制台
(来自mgb的答案和知识库文章99115):
int left = Console.CursorLeft;
int top = Console.CursorTop;
bool ProcessWasRunFromExplorer = (left==0 && top==0);
Run Code Online (Sandbox Code Playgroud)
这告诉您该进程是否在其自己的控制台中启动,而不是它是否是资源管理器.在资源管理器中双击可以执行此操作,但是应用程序内的Start.Process()也会执行相同的操作.
如果要以不同方式处理这些情况,请使用此方法来了解父进程的名称:
System.Console.WriteLine("Process id: {0}", Process.GetCurrentProcess().Id);
string name = Process.GetCurrentProcess().ProcessName ;
System.Console.WriteLine("Process name: {0}", …Run Code Online (Sandbox Code Playgroud) 我正在使用该Shell.Application对象,它允许我编写zip文件的脚本.
但为了使其工作,我需要完整的zip文件路径. File.zip不起作用.c:\the\full\path\file.zip即使脚本在找到文件的同一目录中运行,我也需要.
如何在VBScript中获取文件的完整路径?
类似于%~fIcmd.exe shell中的扩展.
我试图在相关的RFC,IETF RFC 3986中找到它,但无法弄清楚.
HTTP的URI是否允许Unicode或任何类型的非ASCII?
您能否引用支持您答案的部分和RFC.
注意:对于那些可能认为这与编程不相关的人来说 - 确实如此.它与我正在构建的ISAPI过滤器有关.
附录
我已经阅读了RFC 3986的第2.5节.但是RFC 2616,我认为是当前的HTTP协议,早于3986,因此我认为它不能与3986兼容.此外,即使或当HTTP RFC更新后,仍然存在合理化问题 - 换句话说,HTTP URI是否支持所有RFC3986条款,包括哪些适合包含非US-ASCII字符?
对于Visual Studio 2008,我在哪里可以找到.csproj文件的W3C XML Schema(XSD)?
看起来这应该是显而易见的,但我花了一些时间而没有找到一个.
我看了%VS2008%\ xml\Schemas,没有快乐.没有喜欢搜索'管.
是否可以通过COM互操作在.NET对象上调用静态方法?
我知道我可以写一个包装类.如果我不想那样做怎么办?
我为我的网站启用了Firebug的scipts.
但我在Script dropdwon菜单中看不到任何内容.
"网络"选项卡将它们列为"确定".
我试过另一个网站不是我同样的事情?
我正在使用Sandcastle Helpfile Builder生成一个帮助文件(.chm).该项目是一个.shfbproj文件,它是XML格式,与msbuild一起使用.
我想自动更新生成的.chm文件中显示的页脚文本.我用这个片段:
$newFooter = "<FooterText>MyProduct v1.2.3.4</FooterText>";
get-content -Encoding ASCII $projFile.FullName |
%{$_ -replace '<FooterText>(.+)</FooterText>', $newFooter } > $TmpFile
move-item $TmpFile $projFile.FullName -force
Run Code Online (Sandbox Code Playgroud)
定向到$ TmpFile的输出始终是一个多字节字符串.但我不希望这样.如何将输出的编码设置为ASCII?
我在ubuntu 9.10上有emacs v23.1.1.我似乎无法使speedbar显示所有文件,它只显示目录.有没有人对此有所了解?
我在VS2008中有一个Win32 DLL项目,它是用少数几个C模块编写的.
因为我也希望能够在VS2008外部构建,而不依赖于VS2008,所以我制作了一个自定义makefile,它可以完成所有构建和链接步骤.这一切都设置得很好.
现在我想为这个DLL添加几个C++模块.我修改了自定义makefile以将.cpp模块编译为C++,将.c模块编译为常规C(/ Tc).这一切都有效.它把所有东西连在一起,没问题.
我可以配置VS2008项目吗?
我可以在同一个VS2008项目中混合C++和C吗?
或者我需要一个自定义构建步骤吗?
谢谢.
回答
我将VS2008项目设置为C编译.我需要将其更改为Compile As"Default".右键单击项目,选择"属性",然后选择......:
alt text http://i33.tinypic.com/qqsd8g.jpg
谢谢,帕维尔.