Powershell:运行没有徽标的JScript脚本

时间:2014-10-10 09:37:17

标签: powershell jscript file-association wsh

我使用nologo选项将cscript.exe设置为我的默认脚本主机。因此在cmd.exe 我按预期得到了:

> ftype jsfile                                                      
jsfile="C:\Windows\System32\CScript.exe" //nologo "%1" %*           

> reg query HKCR\jsfile\Shell\Open\Command                                                   

HKEY_CLASSES_ROOT\jsfile\Shell\Open\Command                                                  
    (Default)    REG_EXPAND_SZ    "C:\Windows\System32\CScript.exe" //nologo "%1" %*     

> echo  WScript.Echo("Test Echo"); > test.js                        

> test.js                                                           
Test Echo              

但是,转向Powershell:

> powershell -nologo                                                              
PS > .\test.js                 
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation. All rights reserved. 

Test Echo  

似乎CScript没有从Powershell shell获得//nologo。 我怎样才能解决这个问题?

更多用例

它也适用于:

PS > cscript.exe //nologo test.js
Test Echo  
PS > cmd /c test.js 
Test Echo  
PS > cmd /c test
Test Echo  

复制&粘贴测试

有人认为这可能是一个错误。要检查它是否适用于您,您可以使用提升的权限在PS控制台中复制以下内容:

## Change the host to cscript nologo and store old setting
$jstype="Registry::HKEY_CLASSES_ROOT\jsfile\Shell\Open\Command"        
$jsvalue=("`"$env:SystemRoot\System32\CScript.exe`"" + ' //nologo "%1" %*') 
$old=(gp  -Path $jstype   )."(default)"
Set-Item -Path $jstype -value $jsvalue                                  

## The output should be the same (i.e. nologo!)
echo  'WScript.Echo("Test Echo");' > test.js
cmd /c test
.\test.js

## Restore old settings
Set-Item -Path $jstype -value $old

cmd /c test.\test.js输出相同吗?

1 个答案:

答案 0 :(得分:0)

有关问题的详情

似乎Powershell在文件关联方面有一种奇怪的行为 如果您将以下代码段粘贴到提升权限PS shell

$jstype="Registry::HKEY_CLASSES_ROOT\jsfile\Shell\Open\Command"
Set-Item -Path $jstype -value "cscript.exe total non sense"
echo  'WScript.Echo("Test Echo");' > test.js
cmd /c test.js

...将jsfiles与命令字符串cscript.exe total non sense相关联,你得到了应得的错误 但令人惊讶的是写作:

.\test.js

就像一个魅力。所以似乎PS只读取open-command-string的第一项(这里是cscript.exe),然后在其上附加用户字符串(.\test.js),完全忽略了open的其他元素 - 字符串,这里total non sense

确认粘贴:

Set-Item -Path $jstype -value "notepad.exe total non sense"
echo 'WScript.Echo("Test Echo");' > test.js
cmd /c test.js

cmd.exe打开记事本,建议创建“total non sense.txt”文件。

现在写:

.\test.js

根据我刚才所说的,实际的命令运行将是notepad.exe .\test.js,实际上记事本现在将打开.\test.js

解决方案

这是否是一个错误,一个可能的解决方案是创建一个批处理脚本,使用所需的参数调用cscript.exe。我将其命名为C:\Windows\System32\cscript.cmd

要创建脚本和相关关联,请粘贴:

echo "@cscript.exe //nologo %*" | out-file -encoding ASCII C:\Windows\System32\cscript.cmd
$jstype="Registry::HKEY_CLASSES_ROOT\jsfile\Shell\Open\Command"
$jsvalue=("`"$env:SystemRoot\System32\cscript.cmd`"" + ' "%1" %*') 
Set-Item -Path $jstype -value $jsvalue                                  

如您所见,//nologo已从注册表移至cscript.cmd 请注意echo "string" >会生成一个{1}}不喜欢的Unicode文件,因此会生成ASCII过滤器。 打印新的.js打开命令:

cmd.exe

即:cmd /c ftype jsfile

现在两个:

jsfile="C:\Windows\System32\cscript.cmd" "%1" %*

将产生:

cmd /c test
.\test 

没有横幅,请注意,在这两种情况下,您都不需要指定Test Echo 扩展名。

为简单起见,我将.js设置为直接运行cscript.cmd。您可能想要指定其完整路径。