我正在尝试编写一个可以在远程服务器上运行的 PowerShell 脚本。在这些脚本中,我想根据机器上运行的 Windows 版本执行不同的功能。
我似乎无法在网上找到有关如何确定运行脚本的机器(Server 2003、Server 2008 R2 等)上运行的 Windows 版本的任何有用信息。任何想法我怎么能做到这一点?
在 MS-Windows 下的命令行中让我发疯的一件事是,当您使用向上和向下箭头键时,Windows shell(标准 shell 和 PowerShell)从历史记录中检索命令的顺序。
我逐渐喜欢的标准方式,因为它基本上在世界上所有其他 shell 中都是这样做的,是将最后一个命令放入历史堆栈,然后按 up 将检索我运行的最后一个命令,“向上”再次将检索之前的那个,依此类推。如果您从历史记录中选择一个命令并再次提交,该命令将被复制到堆栈的顶部,如果您在下一个提示中向上按,您可以看到最后一个命令,然后是上一个到最后一个命令。如果在浏览历史记录后按“向下”键越过历史堆栈中最近的命令,您将返回到空提示(或您开始浏览历史记录之前的任何提示)。
在 Windows shell 中,它的工作方式非常不同:如果历史记录中有 3 个命令——例如让我们称它们为“A”、“B”和“C”——并且你使用向上箭头键选择命令“B”并执行再次,然后在下一个提示中再次使用向上箭头键,外壳将显示“B”。但这不是您执行的最后一个命令(尽管“B”确实再次复制到历史堆栈中),就像您再次按“向上”键一样,您将显示“A”而不是“C”。如果您向下浏览(到后面的条目),您将再次看到“B”,然后是“C”,然后是“B”,这是输入的最后一个命令 - 但您也不能再进一步:那里
我的问题 - 是否可以设置一些设置来改变这种行为?
我知道只获取 bash 或类似的东西并在 Windows 上使用它的选项,但由于外部限制(如 - 这就是我需要在其中编写脚本的内容),我必须在 PowerShell 或其他 Windows 中工作可以调用 PowerShell 脚本的 shell。
我有一个包含一些文件的目录 Source,我想将其复制到文件夹 Destination。目标可能存在,并且其中可能已经有文件。任何与 Source 中的文件同名的文件都应该被覆盖。
如果我在 Powershell 中运行它:
Copy-Item Source Destination -Force -Recurse
Copy-Item Source Destination -Force -Recurse
Copy-Item Source Destination -Force -Recurse
Run Code Online (Sandbox Code Playgroud)
然后第一行创建文件夹.\Destination并将其复制.\Source到其中,这是我下次要重复的内容。但是,第二行复制.\Source到新.\Destination文件夹(正在创建.\Destination\Source),然后第三行.\Destination\Source再次覆盖。
我怎样才能让它一直像第一种情况一样?也就是说,覆盖.\Destination而不是复制进去?
我在 $PROFILE 文件中设置了他的默认 CursorSize ,例如:
[Console]::CursorSize = 10
Run Code Online (Sandbox Code Playgroud)
或者
$HOST.UI.RawUI.CursorSize = 10
Run Code Online (Sandbox Code Playgroud)
但是在 powershell 中使用另一个控制台后, cursorSize 将重置,例如:

另外,我从注册表编辑器设置CursorSize:
和

有什么方法可以永久更改默认的 CursorSize 吗?
在 ConEmu 上,我打开了一个 powershell 控制台。我希望选项卡的标题反映我所在的当前文件夹。但是,默认情况下,标题是“Windows Powershell”。
我在我的任务中将标签标题指定为“C:\Code”,它会更新,但这是硬编码的。
有没有办法打开 powershell 控制台,并在我导航时让它在选项卡标题中显示当前目录?
我试图在 Powershell 中连接两个变量以形成完整的文件路径和文件名以保存文本文件。
我有两个变量
我试图在这段代码中将两个变量连接在一起:
$objWorkbook = $objExcel.Workbooks.Open $Log_path"\ $Log_name"
我找不到正确的功能组合??
还需要在 Log_path 和 Log_name 变量之间添加“\”以正确格式化文件路径。
我按下Win并输入了“PowerShell”。但是,由于已经打开了一个 PS 控制台窗口,计算机将焦点切换到它,而不是按照我的意图打开一个新窗口。
如何打开PowerShell 控制台窗口的新实例?最好从开始菜单。出于教学原因,我需要它又大又蓝,所以在这种情况下从命令提示符启动 PS 是行不通的。:)
我有一个 Powershell 脚本,其中一行看起来像这样:
Copy-Item \\[machine 1]\[path 1]\[directory 1]\ \\[machine 2]\[path 2]\ -recurse
Run Code Online (Sandbox Code Playgroud)
当我的脚本到达这一行时,出现以下错误:
Copy-Item : Container cannot be copied onto existing leaf item.
At C:\[script path]\[script name]:[line] char:5
+ Copy-Item \\[machine 1]\[path 1]\[directory 1]\ \\[machine 2] ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (\\[machine 1]\[path 1]\[directory 1]:String) [Copy-Item], PSArgumentException
+ FullyQualifiedErrorId : CopyContainerItemToLeafError,Microsoft.PowerShell.Commands.CopyItemCommand
Run Code Online (Sandbox Code Playgroud)
我找到了一个解决方法,即在 [路径 2] 下的 New-Item [目录 1],创建 Copy-Item 将填充内容的根目录,但这会导致另一个问题,即 Copy-Item 抱怨路径已经存在,尽管文件复制实际上成功了。Copy-Item 被宣传为一种“正常工作”的解决方案。我认为我的解决方法没有必要。文档的哪一部分会另有说明?为什么会发生这种情况?我的问题的最佳解决方案是什么?
在装有电池的设备上运行的 Windows 10(以及其他版本)上,我可以使用它powercfg /batteryreport来获取电池的“设计容量”和“上次完全充电容量”,从而了解电池的剩余使用寿命以及它的容量因使用而降低了多少。
C:\Users\superuser\AppData\Local\Temp>powercfg /batteryreport
Battery life report saved to C:\Users\superuser\AppData\Local\Temp\battery-report.html
Run Code Online (Sandbox Code Playgroud)
HTML 报告是即时生成的,并显示我感兴趣的统计数据等:
此外,我可以启动到这台笔记本电脑的内置诊断环境,它显示类似的数字,以及电池的放电周期数。
这些值是从哪里获得的?我希望能够随着时间的推移跟踪一组笔记本电脑的电池寿命数据,最好是通过 Powershell 脚本。这些数据似乎应该在 WMI 中,果然,有一个Win32_Battery 类具有DesignCapacity和FullChargeCapacity字段,但在我测试过的所有系统上,它们都是未定义的:
PS C:\Users\superuser> Get-WmiObject -Class Win32_Battery | Select-Object -Property *Capacity | Format-List
DesignCapacity :
FullChargeCapacity :
Run Code Online (Sandbox Code Playgroud)
必须有一些程序化的方式来访问这些信息,因为powercfg正在这样做。如果有一些 WMI、.NET 或 Powershell 方法可以做到这一点,我想知道。我可以生成powercfg报告然后解析它,但我真的不想实施一个丑陋的解决方法,当最有可能有一种“正确”的方法来做它只是逃避我。
tl; dr:有没有办法通过无人值守的命令行/某些脚本来配置 Windows 8 文件历史记录?
长话短说:我正在配置很多独立(非域)PC,我认为有备份总比没有备份好。在 Windows 7 上,我什至配置了它的标准备份,尽管它被延迟了——默认情况下,它每周一都会显着降低计算机的速度,除非由于某些不明原因用户没有在周末之前关闭他们的电脑,并且它填满了备份介质并停止备份。
我辞职尝试自动化其配置,但至少我可以在那里以管理员身份设置一次,并且它对所有人都有效,包括新用户。而且我正在调度(调度是自动的)自定义脚本以在备份媒体空间不足时删除旧备份,因此之后不需要维护(设置一次即可忘记)。
从 Windows 8 开始,就有了一个叫做文件历史的东西,它对用户的干扰要小得多(它的性能影响几乎不明显),并且它可以自行清理(基于年龄或可用空间的自动历史管理)。这是真正的备份解决方案,现在是真正的:) 但它也需要为每个用户手动配置。这是不可接受的,因为用户会忘记配置它。
我的计划是使用一些 runonce 登录脚本为每个用户配置它。我已经在通过 runonce-logon 脚本做一些事情,所以安装这样的脚本不是问题。但我不知道如何通过脚本配置文件历史记录。
我尝试了一些研究,但我发现的唯一官方(有一些非官方发现,见下面的截图)相关工具是FhManagew.exe,它删除旧文件版本。我需要先通过 GUI 设置它。链接上有完整的API,貌似可以通过该API配置File History。但我认为这是 .NET 应用程序的 API,因此不能通过命令行使用。或者可以吗?
尝试过注册表搜索,但在任何地方都找不到文件历史记录位置:(
具体来说,假设我想设置文件历史记录\\localhost\FileHistory$并保留文件版本直到需要可用空间(默认情况下它会永远保留)。这是它的外观:
供参考:备份到本地共享是使文件历史记录在单个硬盘上工作的解决方法,否则它声称它是不安全的。
这是我通过评论发现的:配置存储在 .xml 文件中的 xml 文件中%LocalAppData%\Microsoft\Windows\FileHistory\Configuration。它在注册表项中被引用HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\fhsvc\Parameters\Configs,值 name = 配置文件夹的路径(如上),值 data = REG_DWORD:1。
但简单地添加这些文件和注册表值并启动服务(有它的脚本)不会启动备份,控制面板中的配置也不会更新。但是,如果已配置文件历史记录,则 xml 文件的更新会反映在控制面板中。
powershell ×10
windows ×2
windows-8 ×2
batch ×1
battery ×1
command-line ×1
conemu ×1
console ×1
file-history ×1
powercfg ×1
windows-10 ×1
windows-7 ×1
wmi ×1