簡體   English   中英

在Windows中以編程方式或從命令行顯示文件屬性對話框

[英]Show file properites dialog programatically or from command line in windows

資源管理器,右鍵單擊單個文件,屬性...

顯示文件屬性對話框。

我希望有一種直接的方法可以從命令行執行此操作,這說明了我對如何使用win api完全缺乏研究:)

回答我自己的問題。 我從提供的鏈接中整理了這個腳本。 可能有更直接的方法-這具有像科學怪人般的光環,但它確實有效。 缺點是存在一種使對話框保持打開狀態(使腳本處於休眠狀態)的黑客,可以將其更改為兩種不同的方法。 該腳本將執行任何動詞,並列出動詞。

用法:將腳本另存為shareGUI.js,使用cscript shareGUI.js <args>調用cscript shareGUI.js <args>

例子:

cscript shareGUI.js C:\\path\\to\\file.txt將列出動詞

cscript shareGUI.js <verb> C:\\path\\to\\file.txt將執行給定動詞

cscript shareGUI.js "Properties" C:\\path\\to\\file.txt將顯示屬性對話框

以黑體字包含通常的免責聲明。

var args = WScript.Arguments;
var usage="Usage: cscript shareGUI.js [verb] <fullpath>";
useage+="\n Function: Executes given verb on given file";
useage+="\n           or lists available verbs";
useage+="\n Notes: Ampersands in property names are remove in listing";
useage+="\n        Ampersands are not required when specifying verb";
useage+="\n Arguments: ";
useage+="\n   verb (optional): Name of verb to be executed, case sensative";
useage+="\n                    if not provided, verbs are listed";
useage+="\n   fullpath: FULLPATH Name of file or directory";
//
if ((args.Unnamed.length == 0) || (args.Named.Exists("?"))) {
  QuitMsg(usage,0);
}
if (args.Unnamed.length > 2) {
  QuitMsg(usage,0);
}
//
var tgt_;
var verb_;
if (args.Unnamed.length == 1) {
  tgt_=args.Unnamed.Item(0);
  verb_ = "";
}else if (args.Unnamed.length == 2) {
  verb_ = args.Unnamed.Item(0);
  tgt_=args.Unnamed.Item(1);
}
//
var shellApp = new ActiveXObject("Shell.Application");
QuitIfNull(shellApp,"System Error:Could not get Shell.Application ActiveXObject",2);
//
var objFSO = new ActiveXObject("Scripting.FileSystemObject");
QuitIfNull(objFSO,"System Error:Could not get Scripting.FileSystemObject ActiveXObject",2);
//
var WSHshell = new ActiveXObject("Wscript.Shell");
QuitIfNull(WSHshell,"System Error:Could not get Wscript.Shell ActiveXObject",2);
//
var doList=verb_=="";
//
var isDir=objFSO.FolderExists(tgt_);
if (isDir) {
  DoForFolder();
}else{
  DoForFile();
}
WScript.Quit(0);// EXIT OK
// functions...
// redundant code prequel
function DoForFile(){
  var objFile = objFSO.GetFile(tgt_);
  QuitIfNull(objFile,"Error:Path \""+tgt_+"\" Not Found",3);
  //
  var folder = shellApp.NameSpace(objFSO.GetParentFolderName(objFile));
  QuitIfNull(folder,"System Error:Could not get parent folder name of \""+tgt_+"\"",3);
  //
  var folderItem=folderItemFromFolder(tgt_,folder);
  QuitIfNull(folderItem,"System Error:Could not folder item from parent folder of \""+tgt_+"\"",3);
  //
  if (doList) {
    listItemVerbs(folderItem);
    return;
  }
  var folderItemVerb=folderItemVerbFromFileItem(verb_,folderItem);
  QuitIfNull(folderItemVerb,"System Error:Could not folder item verb from folder item \""+tgt_+"\"",3);
  //
  runTheVerb(folderItemVerb);
}
// redundant code redux
function DoForFolder(){
  var folder = shellApp.NameSpace(tgt_);
  QuitIfNull(folder,"System Error:Could not folder of \""+tgt_+"\"",2);
  //
  var folderItem=folder.Self;
  QuitIfNull(folderItem,"System Error:Could not folder item of \""+tgt_+"\"",2);
  //
  if (doList) {
    listItemVerbs(folderItem);
    return;
  }
  var folderItemVerb=folderItemVerbFromFileItem(verb_,folderItem);
  QuitIfNull(folderItemVerb,"System Error:Could not folder item verb from folder item \""+tgt_+"\"",3);
  //
  runTheVerb(folderItemVerb);
}
// HACK!! this part sucks, have to remain open else dialog dies
function runTheVerb(verb){
  verb.DoIt();
  WSH.Sleep(5000);
  var focus_way=false;
  if (focus_way) {
    while (WSHshell.AppActivate("Properties")) {WSH.Sleep(2000)};
  }else{ // forever way
    WSH.Sleep(60*60*1000);// sleep for 60 minutes !
  }
}
// match path and return folder item
function folderItemFromFolder(path,folder){
  var folderItems = new Enumerator(folder.Items());
  for (; ! folderItems.atEnd(); folderItems.moveNext()) {
    var folderItem  = folderItems.item();
    if (folderItem.Path==tgt_) {
      //WScript.Echo("tgt_:"+folderItem.Path);
      //WScript.Quit(0);
      return folderItem
    }
  }
  return null;
}
// match verb name
function folderItemVerbFromFileItem(verb,folderItem){
  verb=verb.replace('&','');
  var folderItemVerbs = new Enumerator(folderItem.Verbs());
  for (; ! folderItemVerbs.atEnd(); folderItemVerbs.moveNext()) {
    var folderItemVerb  = folderItemVerbs.item();
    //WScript.echo("Verb:"+folderItemVerb );
    var fix_n=folderItemVerb.Name.replace('&','');
    if (fix_n == verb) {
      return folderItemVerb;
    }
  }
  return null;
}
// echo the verbs, ignore blanks, remove ampersands
function listItemVerbs(folderItem){
  var folderItemVerbs = new Enumerator(folderItem.Verbs());
  for (; ! folderItemVerbs.atEnd(); folderItemVerbs.moveNext()) {
    var folderItemVerb  = folderItemVerbs.item();
    var fix_n=folderItemVerb.Name.replace('&','');
    if (fix_n!="") {
      WScript.echo(""+fix_n );
    }
  }
}
function QuitIfNull(who,why,how){
  if (who==null) {
    QuitMsg(why,how);
  }
}
function QuitMsg(why,how){
  WScript.Echo(why);
  WScript.Quit(how);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM