这很可能与我编写.bat文件的方式有关(扰流板:我对这些文件非常新),因为Powershell脚本本身可以工作。
背景
我有很多客户案例需要我导入一个注册表文件并查看它。我试图通过创建一个脚本来自动执行此过程,该脚本允许我右键单击.reg文件并使用SendTo将其发送到脚本,然后将所有内容添加到特定的注册表项。基本上它会:
到目前为止完成的工作
这是我到目前为止所完成的脚本:
param(
[Parameter(mandatory=$true)][string]$FileName
)
$RegistryParent = "HKLM:\Software\Cases"
$RegistryFile = Get-ChildItem -Path $FileName
$FullName = $RegistryFile.FullName
if(($RegistryFile.Extension -eq '.reg') -and ($FullName -like '*CaseNumber-*')){
$IndexOfCaseStart = ($FullName).IndexOf('CaseNumber-')
$IndexOfCaseEnd = ($FullName).IndexOf('\',$IndexOfCaseStart)
$CaseNumber = ($FullName).Substring($IndexOfCaseStart,$IndexOfCaseEnd-$IndexOfCaseStart)
$ImportTo = "HKLM\Software\Cases\$CaseNumber"
if(!(Test-Path $ImportTo)){
New-Item -Path $RegistryParent -Name $CaseNumber
reg.exe restore $ImportTo ($FullName)
}
}
运行此脚本只能完美地正确导入我抛出的任何.reg文件。据我了解,你不能在shell:SendTo文件夹中有一个Powershell脚本,所以我在那里使用.bat文件来调用Powershell脚本。 .bat文件如下所示:
@echo off
powershell.exe -Command "'\\SERVER\pathToPowershellScript\AddToRegistry.ps1 -FileName %1'"
powershell.exe -noexit
问题
完成没有任何失败,但是在注册表中没有创建注册表项。如果在.bat文件中添加echo powershell.exe -Command“'\ SERVER \ pathToPowershellScript \ AddToRegistry.ps1 -FileName%1'”,我会得到以下内容:
'\\SERVER\pathToRegistryKey'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported. Defaulting to Windows directory.
'powershell.exe -Command "'\\SERVER\pathToPowershellScript\AddToRegistry.ps1 -FileName \\SERVER\pathToRegistryKey\registrykey.reg'"
\\SERVER\pathToPowershellScript\AddToRegistry.ps1 -FileName \\SERVER\pathToRegistryKey\registrykey.reg
Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.
我的猜测是Powershell启动但不运行脚本,或者我在.bat文件中使用错误的参数来调用脚本。从我的角度来看,它看起来像启动Powershell,然后它只是选择Scriptpath.ps1 -FileName Registrypath.reg并回显它,但我不习惯读取.bat文件输出所以我很可能错了这里。
我很乐意提供更多信息。如果有人有任何可以帮助我的东西,我将不胜感激!
修改
删除'引号会引发错误,因为Powershell将其解释为单独的命令(因为它在My Documents文件夹中):
@echo off
powershell.exe -Command "\\SERVER\pathToPowershellScript\AddToRegistry.ps1 -FileName %1"
powershell.exe -noexit
这给出了:
\ SERVER \ Users \ UserName \ My:术语'\ _SERVER \ Users \ UserName \ My'是 不被识别为cmdlet,函数,脚本文件或的名称 可操作程序。检查......
在脚本开头添加句点也不会。我猜我需要使用'引号将位置包装到Powershell脚本中,但我需要在.bat文件中将它们转义。
EDIT2:
将\ SERVER \添加到所有路径以反映我正在使用完整路径而不是相对路径。
EDIT3:
以下是对结果的一些尝试。
@echo off
powershell.exe -Command "\\SERVER\pathToPowershellScript\AddToRegistry.ps1" -FileName "%1" -Noprofile
powershell.exe -noexit
上面给出了与编辑2中相同的错误。我尝试使用-File而不是-Command但它仍然无法运行。
@echo off
powershell.exe -File"\\SERVER\pathToPowershellScript\AddToRegistry.ps1" -FileName "%1" -Noprofile
powershell.exe -noexit
这给出了以下内容:
\ SERVER \ Users \ UserName \ pathToPowershellScript \ AddToRegistry.ps1:找不到与参数名称'Noprofile'匹配的参数。
编辑4:
我确实找到了一个实际运行脚本,即使它没有完成脚本,但现在它实际上至少启动了。它似乎没有足够的权限。如果我从.bat文件的上述版本中删除-NoProfile,我会收到以下错误:
New-Item:不允许请求的注册表访问。 在\ SERVER \ Users \ UserName \ pathToPowershellScript \ AddToRegistry.ps1:19 char:5
+ New-Item -Path $RegistryParent -Name $CaseNumber + CategoryInfo : PermissionDenied: (HKEY_LOCAL_MACH...\Cases:String) [New-Item], SecurityException + FullyQualifiedErrorId : System.Security.SecurityException,Microsoft.PowerShell.Commands.NewItemCommand
我已经尝试将-ExecutionPolicy Bypass添加到应该调用脚本的参数中,但它仍然说我没有注册表访问...
答案 0 :(得分:1)
让我们探索当前脚本的作用
@echo off
REM echo the string following command
powershell.exe -Command "'pathToPowershellScript\AddToRegistry.ps1 -FileName %1'"
REM opens an interactive powershell windows
powershell.exe -noexit
以下是我尝试修复问题
@echo off
REM Execute AddToRegistry and pass %1
powershell.exe -Command ".\pathToPowershellScript\AddToRegistry.ps1" -FileName "%1"
REM opens an interactive powershell windows
powershell.exe -noexit