使用Powershell和SendTo

时间:2017-01-11 19:16:45

标签: windows powershell batch-file cmd registry

这很可能与我编写.bat文件的方式有关(扰流板:我对这些文件非常新),因为Powershell脚本本身可以工作。

背景
我有很多客户案例需要我导入一个注册表文件并查看它。我试图通过创建一个脚本来自动执行此过程,该脚本允许我右键单击.reg文件并使用SendTo将其发送到脚本,然后将所有内容添加到特定的注册表项。基本上它会:

  • 查看我尝试发送到脚本的.reg文件的路径
  • 在路径
  • 中查找案例编号的开头
  • 创建一个名称相同的注册表项
  • 将.reg文件的内容导入该密钥

到目前为止完成的工作
这是我到目前为止所完成的脚本:

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添加到应该调用脚本的参数中,但它仍然说我没有注册表访问...

1 个答案:

答案 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