我使用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
输出相同吗?
答案 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
。您可能想要指定其完整路径。