如何尽可能简单地为所有同事设置默认的 powershell 配置文件?
How can I set up a default powershell profile for all my co workers at work as simple as possible?
我想达到什么目的?
我有一个 ps1 文件,里面有我的所有功能。在第一步中,我想将其转换为 ps 模块。然后我想要以下内容:
- 同事得到一个脚本或球棒,他必须 运行 一次。这会将他的模块环境路径
$Env:PSModulePath
设置为每个人都可以访问的网络驱动器上的路径
- 复制并粘贴自定义配置文件。ps1 到导入模块的用户
%userprofile%\Documents\WindowsPowershell
- 每个用户现在都应该拥有我在他们的 shell
中提供的强大 shell 脚本
我是怎么解决的
我和一位同事过去的设置方式是这样的:
(我们有一个执行以下操作的 profile.ps1
文件):
#set path for profile_loader.ps1
$path = "\server\share\folderwithscripts";
#call profile_loader.ps1
. "$path"
然后这个 profile_loader.ps1
baiscally 只会加载大量脚本(ps1 文件),如下所示:
. "\server\share\pathtoanotherscript.ps1
一行接一行。
我不喜欢它,它对于我将来要设置的其他 25 位同事来说太复杂了。
问题
实现此目标的最佳方法是什么?一个很好的旧 .bat 文件,可以将 ps1 文件复制并粘贴到他们的用户配置文件中?或者有更好的方法吗?
作为将 $profile
擦除并设置为 "company default" 的人,看在上帝的份上,请不要这样做。
如果必须,那么我建议只创建一个您希望每个人都拥有的配置文件,并将您的所有模块放在一个共享位置,例如安全锁定的 Sysadmin 文件夹。
在你的机器上做psedit $proile.AllUsersAllHosts
,修改它,然后用你自己的强制配置文件制作一个包含所有你想销毁的主机名的文本文件。把它放在那里让它默认导入你的模块。
# Checks your server share for any PSM1 files, could change to include PS1 as well I suppose. Long name because its in a $Profile so ¯\_(ツ)_/¯
$ModulePathWithLongNameBecauseSomeoneMayUseThisInAnActualScript = Get-ChildItem -file -Recurse "\server\share\" -Include "*.psm1"
# Sets module path for other adhoc module calls if they dont want to restart their Powershell
$env:PSModulePath = $env:PSModulePath + ";\server\share\"
# Imports all PSM1 files from the ModulePath*
Foreach($psm in $ModulePathWithLongNameBecauseSomeoneMayUseThisInAnActualScript){
Import-Module "$($ModulePath.FullName)"
}
运行 在您的机器上将您的灵魂粉碎 $profile
传递给可能有自己设置的同事。
# Get a list of machines that your staff will use and throw them into a txt or csv etc.
$PCsForForcedProfile = Get-Content "\server\share\PleaseNo.txt"
Foreach($Colleague in $PCsForForcedProfile){
Copy-Item "C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1" "\$Colleague\C$\Windows\System32\WindowsPowerShell\v1.0\" -force
}
我想达到什么目的?
我有一个 ps1 文件,里面有我的所有功能。在第一步中,我想将其转换为 ps 模块。然后我想要以下内容:
- 同事得到一个脚本或球棒,他必须 运行 一次。这会将他的模块环境路径
$Env:PSModulePath
设置为每个人都可以访问的网络驱动器上的路径 - 复制并粘贴自定义配置文件。ps1 到导入模块的用户
%userprofile%\Documents\WindowsPowershell
- 每个用户现在都应该拥有我在他们的 shell 中提供的强大 shell 脚本
我是怎么解决的
我和一位同事过去的设置方式是这样的:
(我们有一个执行以下操作的 profile.ps1
文件):
#set path for profile_loader.ps1
$path = "\server\share\folderwithscripts";
#call profile_loader.ps1
. "$path"
然后这个 profile_loader.ps1
baiscally 只会加载大量脚本(ps1 文件),如下所示:
. "\server\share\pathtoanotherscript.ps1
一行接一行。
我不喜欢它,它对于我将来要设置的其他 25 位同事来说太复杂了。
问题
实现此目标的最佳方法是什么?一个很好的旧 .bat 文件,可以将 ps1 文件复制并粘贴到他们的用户配置文件中?或者有更好的方法吗?
作为将 $profile
擦除并设置为 "company default" 的人,看在上帝的份上,请不要这样做。
如果必须,那么我建议只创建一个您希望每个人都拥有的配置文件,并将您的所有模块放在一个共享位置,例如安全锁定的 Sysadmin 文件夹。
在你的机器上做psedit $proile.AllUsersAllHosts
,修改它,然后用你自己的强制配置文件制作一个包含所有你想销毁的主机名的文本文件。把它放在那里让它默认导入你的模块。
# Checks your server share for any PSM1 files, could change to include PS1 as well I suppose. Long name because its in a $Profile so ¯\_(ツ)_/¯
$ModulePathWithLongNameBecauseSomeoneMayUseThisInAnActualScript = Get-ChildItem -file -Recurse "\server\share\" -Include "*.psm1"
# Sets module path for other adhoc module calls if they dont want to restart their Powershell
$env:PSModulePath = $env:PSModulePath + ";\server\share\"
# Imports all PSM1 files from the ModulePath*
Foreach($psm in $ModulePathWithLongNameBecauseSomeoneMayUseThisInAnActualScript){
Import-Module "$($ModulePath.FullName)"
}
运行 在您的机器上将您的灵魂粉碎 $profile
传递给可能有自己设置的同事。
# Get a list of machines that your staff will use and throw them into a txt or csv etc.
$PCsForForcedProfile = Get-Content "\server\share\PleaseNo.txt"
Foreach($Colleague in $PCsForForcedProfile){
Copy-Item "C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1" "\$Colleague\C$\Windows\System32\WindowsPowerShell\v1.0\" -force
}