脚本环境影响父外壳

时间:2019-07-07 13:00:30

标签: powershell

在PowerShell脚本中修改某些方面似乎可以修改正在运行的shell。如果我提供脚本而不是运行脚本,这是可以预期的。

script.ps1

// react-native.config.js
module.exports = {
  dependencies: {
    '<dependency>': {
      platforms: {
        android: null, // disable Android platform, other platforms will still autolink
      },
    },
  },
};
[cultureinfo]::currentculture = [cultureinfo]::InvariantCulture
Set-PSDebug -Trace 1

因此很明显,调试跟踪处于活动状态,并且文化变化仍在持续...

1 个答案:

答案 0 :(得分:4)

the docs开始,[cultureinfo]::currentculture](已加强调):

  

获取或设置CultureInfo对象,该对象表示当前线程使用的文化

也就是说,设计更改将对整个线程(不仅是脚本)生效,并且会在线程的整个生命周期(脚本退出后)一直存在,直到您再次更改为止。

因此,如果希望您的文化变化受到影响,则必须手动

  • 事先保存以前的文化
  • 之后恢复这种文化。

注意事项

  • Windows PowerShell 中,区域性会在每次运行后自动重置为启动值,但仅在命令提示符下显示。调用命令或脚本;相反,如果一个脚本调用另一个脚本,并且被调用者更改了当前区域性,则该更改对调用脚本仍然有效。

  • 相比之下,PowerShell Core 的行为始终如一,并且永远不会自动重置当前区域性。


请注意,该行为类似于使用Set-Locationcd)来更改当前位置(目录),这也影响了整个线程,就像在cmd.exe批处理中一样文件(除非您使用setlocal)-例如,在Bash脚本中为 not

在PowerShell中,脚本文件(*.ps1)在运行中 ,批处理文件(*.cmd*.bat )中的内容,而Bash之类的类似POSIX的外壳程序则在子进程中运行脚本,该脚本隐式地且始终将范围内的环境变化范围限定于此类脚本。