我为自动化套件提供了广泛的CMD脚本集。
在使用CMD.exe
的控制台中,一切正常。安装Windows Creator的更新后,PowerShell通过Explorer的菜单选项成为新的默认Windows Shell,我的脚本会随机中断。我不能为repro提供任何有意义的代码,主要有两个原因:
我可以告诉您的是,该套件很大程度上依赖于退出代码,
findstr.exe
和type
的使用。我知道Windows宏之类的东西,例如
%Var%
不兼容,但是我假设由于我唯一的调用是对.bat
文件的调用,因此.bat
行为将是我唯一需要担心的事情。如果不是这种情况,我的初始
.bat
是否应该使用我的参数来触发CMD.exe
实例的直接执行?如果是这样,那么对PowerShell友好的最佳方法是什么?
最佳答案
eryksun's对这个问题的评论都值得关注。 After installing the Windows Creator's update, where PowerShell becomes the new default Windows shell via Explorer's menu options
答案的这一部分为问题标题中的一般问题提供了一般答案。请参阅下一部分,以了解针对OP方案的特定注意事项。
一般来说,从PowerShell调用批处理文件时,只需要注意一些事项:.bat
或.cmd
),例如script_name.bat
script_name
),该形式可以是:*.ps1
),恰好位于$env:PATH
(%PATH%
)变量中前面列出的目录中;如果多个具有相同名称的可执行文件位于同一(最早)目录中,则下一点也适用。 *.ps1
)或可执行文件,其扩展名位于.bat
环境变量中的.cmd
或%PATHEXT%
之前。 ./
cmd.exe
不同,它不会仅通过文件名调用位于当前目录中的可执行文件,因此,调用script_name.bat
来调用当前目录中具有该名称的批处理文件是不起作用的。[1] ./
(.\
,如果仅在Windows上运行);例如./script_name.bat
。 --%
(PSv3+ stop-parsing symbol)来传递其余参数,就好像它们是从批处理文件传递过来一样(除%<var>%
样式的环境变量引用扩展之外,PowerShell不会对其进行解释)。
[1] eryksun指出,在Vista +上,您可以通过定义环境变量cmd
(它的特定值无关紧要),使NoDefaultCurrentDirectoryInExePath
的行为类似于PowerShell。
尽管不明智,但是您仍然可以通过将.
显式添加到%PATH%
/$env:PATH
变量中来强制两种环境始终在当前目录中找到可执行文件;如果在.
之前添加前缀,则会获得默认的cmd
行为。
至于您的特定情况:
这适用于以下情况:File
菜单显示Open Windows PowerShell
代替Open command prompt
(cmd
)。
但是,对于从文件资源管理器中打开/双击批处理文件时如何调用批处理文件没有什么改变:注册表中HKEY_CLASSES_ROOT\batchfile
和HKEY_CLASSES_ROOT\cmdfile
的子项仍将shell\open
动词定义为"%1" %*
,应调用批处理文件像以前一样隐式地使用cmd /c
。
但是,根据您的注释,批处理文件永远不会直接从文件资源管理器运行,因为它需要参数值,并且它通过两种基本方式调用:cmd
对话框中输入cmd
后,通过Run
控制台显式地进行操作。cmd
调用批处理文件。 File
菜单通过PowerShell显式进行。cd /d "%~dp0"
将其设置到其自己的位置)时,调用才会起作用。
关于windows - 在使用PowerShell的控制台中使用CMD脚本时,是否存在根本的不兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44637771/