小编Isz*_*szi的帖子

仅从PowerShell中的路径获取驱动器号

我想在PowerShell中创建一个脚本来帮助轻松翻译这样的路径:

H:\MyDoc.docx
Run Code Online (Sandbox Code Playgroud)

进入其真正的绝对路径,如下:

\\FileServer\UserShares\Organization\Department\Me\MyDoc.docx
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我已经建立了我的本地计算机上的网络驱动器映射指向H:\\\FileServer\UserShares\Organization\Department\Me\,但我需要轻松扩展,以便与谁可能没有驱动器映射其他用户共享映射路径.

获得驱动器的路径很容易.

(Get-PSDrive H).DisplayRoot
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试编写一个更通用的脚本时,我遇到了一个问题,该脚本可以自动适应可能指向其他映射驱动器的路径(我确实有几个).我正在弄清楚的是如何从给定路径中提取驱动器号.

我认为Split-Path会有所帮助,但似乎只能将路径分开 - "父"和"叶" - 两者都不会只给出驱动器号.

有没有办法让刚刚从PowerShell中的给定路径的驱动器盘符?

注意:我需要它来处理指向文件文件夹的路径.

powershell

6
推荐指数
2
解决办法
1万
查看次数

我应该如何使用批处理脚本来创建其他脚本?

我正在创建一个我想成为双重用途的脚本:

  1. 该脚本将使用用户输入选项来执行命令以更改某些设置.这部分差不多完成了.

    • 该脚本通过SETLOCAL/ ENDLOCAL和将用户的选择收集到本地环境变量中SET /P,并在稍后的脚本中调用变量以执行命令.

    • 收集用户选项后,有一个验证步骤显示这些选项,并在继续执行命令之前要求用户进行确认.

  2. 该脚本将为用户提供一个选项,可以自动创建一个内置选项的新脚本,以便将来使用.

这是我目前的计划概念,以达到目标#2,虽然我不确定如何写它:

  1. 构建可以复制的模板脚本,以开始创建自定义脚本.

    • 在模板脚本的最开始,SETLOCAL将隔离由最终脚本创建的环境变量,以便在脚本完成运行后它们不会持久存在.

    • 紧接着SETLOCAL将是一个GOTO指向脚本最末端标签的命令.标签将是已完成脚本中变量定义部分的开头.

    • 在之后GOTO的命令将一个名为STARTEXEC将要跳楼后,变量的定义是完整的标签.

    • 就在变量部分标签之前将是带有一些命令的标记部分以退出脚本.

  2. 进入当前脚本:

    • CHOICE在验证步骤中添加一个,询问用户是否要创建静态脚本.如果是,则提示用户输入文件名,SET /P然后在此脚本的执行流程中包含脚本构建命令GOTO.
       
  3. 使用类似这些的命令来构建静态脚本的变量部分:

    COPY ScriptTemplate.bat %UserFileName%.bat
    ECHO SET VAR1=%UserVar1% >> %UserFileName%.bat
    ECHO SET VAR2=%UserVar2% >> %UserFileName%.bat

  4. 再添加一行以确保静态脚本跳转到命令执行.

    ECHO GOTO STARTEXEC >> %UserFileName%.bat

我的问题在这里:

  1. 我的方法是否相当合理,还是通过批处理脚本还有更好的方法吗?

  2. 在返回到变量部分之前,我应该使用什么来退出静态脚本?我知道我需要一个ENDLOCAL.会EXIT在这里工作,还是有其他更合适的东西?

windows batch-file

5
推荐指数
1
解决办法
836
查看次数

如何在Batch中正确执行模数运算?

我正在尝试编写一个批处理文件,该文件根据对set变量执行的模运算的结果执行操作.但是,我似乎无法做到这一点.

首先测试我的数学运算语法,我一直在尝试使用更简单的脚本来产生所需的结果.

:START
SETLOCAL
SET /P Input-Num="Input Number: "
SET /A Input-Num=%Input-Num% %% 2
ECHO %Input-Num%
ENDLOCAL
PAUSE 
:END
Run Code Online (Sandbox Code Playgroud)

如果我输入5,预期的输出是1.但是,相反,我得到一条消息Missing operator.,然后输出5.

我在这做错了什么?

math batch-file windows-7

5
推荐指数
1
解决办法
2万
查看次数

批处理文件不能处理大数字吗?

为了我自己的娱乐,我决定尝试编写一个批处理文件来计算Hailstone序列.但是,我遇到了一些带有大量数字的小问题.

一,代码:

:START
@ECHO OFF
SETLOCAL
SET /P InputVar="Input Number: "
ECHO.
ECHO %InputVar%
SET ItCount=0

:COLLATZ
SET /A ItCount=%ItCount%+1
SET /A Odd=%InputVar%%%2
IF %Odd% EQU 1 (
    SET /A OutputNum=%InputVar%*3+1
) ELSE (
    SET /A OutputNum=%InputVar%/2
)
ECHO %OutputNum%
IF %OutputNum% LSS 1 (
    GOTO ERROR
) ELSE (
    GOTO RECYCLE
)

:ERROR
ECHO.
ECHO ERROR!
GOTO END

:RECYCLE
IF %OutputNum% EQU 1 (
    GOTO FINISH
) ELSE ( 
    SET InputVar=%OutputNum%
    GOTO COLLATZ
)

:FINISH
ECHO.
ECHO …
Run Code Online (Sandbox Code Playgroud)

batch-file

5
推荐指数
1
解决办法
5737
查看次数

我的切换功能出了什么问题

我正在尝试编写一个脚本,其中一部分类似于以下内容:

function FooBarMeh ($in,$1,$2)
{
    switch($in)
    {
        $1{'FOO'}
        $2{'BAR'}
        default{'MEH'}
    }
}
$a='A'
$b='B'
$c=read-host
FooBarMeh ($c,$a,$b)
Run Code Online (Sandbox Code Playgroud)

FOO如果我输入A,BAR如果我输入B,并且MEH如果我输入其他内容,我希望脚本返回.

然而,这是实际发生的事情:

在此输入图像描述

无论我输入什么,我都会MEH三次回到我身边.如果我完全没想到MEH- 即使我的前两个切换选项在某种程度上被打破了 - 我想我应该只看一次.我为什么要去MEH,更不用说三次了?

在Windows 7旗舰版上使用PowerShell 4.0

powershell

2
推荐指数
1
解决办法
56
查看次数

在PowerShell中创建列表框

我正在尝试编写一个包含列表框的PowerShell脚本.为了确保我已经掌握了所需的概念,我在TechNet上查找了一个教程并试图复制所提供的代码.

http://technet.microsoft.com/en-us/library/ff730949.aspx

如果我正确地遵循演练和脚本,则看起来该脚本旨在显示一个对话框,然后将所选项目输出到CLI.我已经复制了对话框,但我无法将选择内容写入CLI.我甚至修改了最后一行来显式调用Write-Output来显示$ x的值.

除了为$ x实际写出任何值之外,关于此脚本的所有内容似乎都按预期工作.由于echo "$x"可能是所有代码中最简单的一行,我只能假设问题实际上是将数据写入 $ x.

下面是我的PowerShell ISE窗口的剪切和粘贴,后者又从上述TechNet文章中剪切并粘贴:

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 

$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "Select a Computer"
$objForm.Size = New-Object System.Drawing.Size(300,200) 
$objForm.StartPosition = "CenterScreen"

$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$x=$objListBox.SelectedItem;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm.Close()}})

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,120)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click({$x=$objListBox.SelectedItem;$objForm.Close()})
$objForm.Controls.Add($OKButton)

$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(150,120)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"
$CancelButton.Add_Click({$objForm.Close()}) …
Run Code Online (Sandbox Code Playgroud)

powershell

1
推荐指数
1
解决办法
2万
查看次数

有没有办法在PowerShell中使用单个交换机匹配来定位多个条件?

在示例脚本中,如果我的变量匹配1,我想执行一个代码块,如果匹配2,3,5或8,则执行另一个代码,而对于4,6或7,我想执行不同的块.

我想做这样的事情:

switch($x)
{
    1 {'Condition 1'}
    2 -or 3 -or -5 -or 8 {'Condition 2'}
    4 -or 6 -or 7 {'Condition 3'}
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.有没有办法用switch进行这种工作,而不必单独拼出所有8个选项,或者只有多个if语句才能实现?

powershell

1
推荐指数
1
解决办法
691
查看次数

标签 统计

powershell ×4

batch-file ×3

math ×1

windows ×1

windows-7 ×1