Powershell 脚本环境影响父shell
修改PowerShell脚本中的某些方面似乎会修改正在运行的shell。如果我为脚本提供源代码,而不是运行脚本,则会出现这种情况 script.ps1Powershell 脚本环境影响父shell,powershell,Powershell,修改PowerShell脚本中的某些方面似乎会修改正在运行的shell。如果我为脚本提供源代码,而不是运行脚本,则会出现这种情况 script.ps1 [cultureinfo]::currentculture=[cultureinfo]::不变量文化 设置PSDebug-跟踪1 所以很明显,调试跟踪是活动的,并且文化变化是持久的…来自for[cultureinfo]::currentculture](重点添加): 获取或设置表示当前线程使用的区域性的CultureInfo对象 也就是说,按设
[cultureinfo]::currentculture=[cultureinfo]::不变量文化
设置PSDebug-跟踪1
所以很明显,调试跟踪是活动的,并且文化变化是持久的…来自for[cultureinfo]::currentculture]
(重点添加):
获取或设置表示当前线程使用的区域性的CultureInfo对象
也就是说,按设计进行的更改对整个线程生效,而不仅仅是对脚本生效,并且在整个线程的生命周期内(在脚本退出后)或直到您再次更改它为止
因此,如果要确定区域性更改的范围,必须手动执行以下操作:
- 事先保存以前的当前区域性
- 之后恢复这种文化
- 在Windows PowerShell中,区域性自动重置为启动值,但仅在每次调用命令或脚本后在命令提示下重置-有关背景信息和解决方法,请参阅;相反,如果一个脚本调用另一个脚本,并且被调用方更改了当前区域性,则该更改对调用脚本仍然有效
- 相比之下,PowerShell Core的行为一致,并且从不自动重置当前区域性
请注意,该行为类似于使用
Set Location
(cd
)更改当前位置(目录),这也会影响整个线程,就像在cmd.exe
批处理文件中一样(除非您使用setlocal
),但在Bash脚本中则不会
在PowerShell中,脚本文件(
*.ps1
)在进程中运行,cmd.exe
中的批处理文件(*.cmd
,*.bat
),而类似于POSIX的shell(如Bash)在子进程中运行脚本,这会隐式地、不变地将环境更改范围限定为此类脚本。关于最后一段,看见
> [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)