脚本环境影响父shell

Tho*_*ten 3 powershell

修改 PowerShell 脚本中的某些方面似乎会修改正在运行的 shell。如果我提供脚本而不是运行它,这将是意料之中的。

脚本.ps1

[cultureinfo]::currentculture = [cultureinfo]::InvariantCulture
Set-PSDebug -Trace 1
Run Code Online (Sandbox Code Playgroud)
> [cultureinfo]::currentculture

LCID             Name             DisplayName
----             ----             -----------
1031             de-DE            Deutsch (Deutschland)

> .\script.ps1
> [cultureinfo]::currentculture
DEBUG:    1+  >>>> [cultureinfo]::currentculture

LCID             Name             DisplayName
----             ----             -----------
127                               Unveränderliche Sprache (Unveränderliches Land bzw. unveränderliche Region)
Run Code Online (Sandbox Code Playgroud)

很明显,调试跟踪是活跃的,并且文化变化持续存在......

mkl*_*nt0 5

该文档[cultureinfo]::currentculture](强调):

获取或设置表示当前线程使用的区域性的 CultureInfo 对象。

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

因此,如果您希望将您的文化更改限定范围内,您必须手动

  • 预先保存以前当前的文化
  • 之后恢复那种文化。

警告

  • Windows PowerShell 中,区域性会自动重置为启动值,但仅在命令提示符下,在每次调用命令或脚本后 - 请参阅此答案以了解背景信息和解决方法;相比之下,如果一个脚本调用另一个脚本并且被调用者更改了当前区域性,则该更改对调用脚本保持有效。

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


请注意,该行为类似于使用Set-Location( cd) 更改当前位置(目录),这也会影响整个线程,就像它在cmd.exe批处理文件中所做的那样(除非您使用setlocal) - 但不是在 Bash 脚本中,例如。

在 PowerShell 中,脚本文件 ( *.ps1)在进程内运行批处理文件 ( *.cmd, *.bat) 在 中运行cmd.exe,而类似 POSIX 的外壳程序(例如 Bash)在子进程中运行脚本,它隐式且总是将环境更改范围限定为此类脚本。